java - Bagaimana untuk menangkap pengecualian dan rollback apabila multi-threading didayakan dalam transaksi pada musim bunga?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-12 09:26:37
0
1
1692

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

membalas semua(1)
世界只因有你

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan