Heim > Fragen und Antworten > Hauptteil
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);
}
世界只因有你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方法所在的类。