Rumah > Soal Jawab > teks badan
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);
}
世界只因有你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.