Maison  >  Questions et réponses  >  le corps du texte

java - Comment intercepter les exceptions et les restaurations lorsque le multithreading est activé dans une transaction au printemps?

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);
}
女神的闺蜜爱上我女神的闺蜜爱上我2708 Il y a quelques jours1634

répondre à tous(1)je répondrai

  • 世界只因有你

    世界只因有你2017-06-12 09:28:37

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

    répondre
    0
  • Annulerrépondre