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);
}
@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:
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.