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 :
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.