Rumah  >  Soal Jawab  >  teks badan

java - Bagaimana untuk menangkap pengecualian dan rollback apabila multi-threading didayakan dalam transaksi pada musim bunga?

Andaikan saya menggunakan 2 utas dalam urus niaga untuk mempercepatkan pemprosesan Jika kaedah userDao.addOrg() melemparkan RuntimeException, transaksi tidak akan ditarik balik dan ralat tidak akan ditangkap.

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);
}
女神的闺蜜爱上我女神的闺蜜爱上我2686 hari yang lalu1606

membalas semua(1)saya akan balas

  • 世界只因有你

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

    @Transactional hanya boleh mengawal transaksi satu thread, jadi anak thread tidak dikawal oleh transaksi pada kaedah tambah. Anda boleh memulakan urus niaga baharu pada kaedah yang dipanggil oleh urutan anak dan gulung semula.

    Dayakan rangkaian kanak-kanak memanggil kaedah terkawal transaksi:

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

    Perhatikan bahawa @Transactional dilaksanakan melalui proksi, jadi addMethod mesti diletakkan dalam AddOperation kelas baharu dan tidak boleh diletakkan dalam kelas di mana kaedah tambah terletak.

    balas
    0
  • Batalbalas