Supposons que j'utilise 2 threads dans une transaction pour accélérer le traitement. Si la méthode userDao.addOrg() renvoie une RuntimeException, la transaction ne sera pas annulée et l'erreur ne sera pas détectée. Que dois-je faire ?
ExecutorService executorService = Executors.newCachedThreadPool();
@Transactional(rollbackFor=Throwable.class)
public void add(){
CountDownLatch cdl = new CountDownLatch(2);
executorService.submit(new Runnable() {
public void run() {
userDao.addOrg(); //拋出RuntimeException異常
cdl.countDown();
}
});
executorService.submit(new Runnable() {
public void run() {
userDao.addSystem();
cdl.countDown();
}
});
cdl.wait(10,TimeUnit.SECONDS);
}
@Transactional ne peut contr?ler que les transactions à thread unique, les threads enfants ne sont donc pas contr?lés par les transactions sur la méthode add. Vous pouvez démarrer une nouvelle transaction sur la méthode appelée par le thread enfant et revenir en arrière.
Autoriser les threads enfants à appeler des méthodes contr?lées par les transactions?:
executorService.submit(new Runnable() {
public void run() {
addOperation.addMethod();
}
});
@Component
class AddOperation{
@Transactional
public addMethod(){
userDao.addOrg(); //拋出RuntimeException異常
cdl.countDown();
}
}
Notez que @Transactional est implémenté via un proxy, donc addMethod doit être placé dans la nouvelle classe AddOperation et ne peut pas être placé dans la classe où se trouve la méthode add.