suchen

Heim  >  Fragen und Antworten  >  Hauptteil

java - Wie kann ich Ausnahmen und Rollbacks abfangen, wenn Multithreading in einer Transaktion im Frühjahr aktiviert ist?

Angenommen, ich verwende 2 Threads in einer Transaktion, um die Verarbeitung zu beschleunigen, wird die Transaktion nicht zurückgesetzt und der Fehler wird nicht abgefangen.

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);
}
女神的闺蜜爱上我女神的闺蜜爱上我2755 Tage vor1690

Antworte allen(1)Ich werde antworten

  • 世界只因有你

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

    @Transactional只能控制单线程事务,所以子线程是不受add方法上的事务控制的。你可以在子线程调用的方法上开启新事务,进行回滚。

    开启子线程调用受事务控制的方法:

    executorService.submit(new Runnable() {
                
                public void run() {    
                    addOperation.addMethod();
                }
            });
    @Component
    class AddOperation{
        @Transactional
        public addMethod(){
           userDao.addOrg(); //抛出RuntimeException异常
           cdl.countDown();
        }
    }

    注意,@Transactional是通过proxy实现的,所以addMethod要置于新类AddOperation中,不能放到add方法所在的类。

    Antwort
    0
  • StornierenAntwort