1、原理见上篇文章:Spring事务架构详解 https://www.jianshu.com/p/acf84a4ed3a3
2、对于下面例子,PROPAGATION_REQUIRES_NEW不是也可以实现么?
----并非如此,最根本区别:NESTED还在一个事务中,但是与主事务一块提交
1)、对于NESTED,B、C为A的子事务,可以读取A未提交的数据,但是REQUIRES_NEW却不行,除非B、C的隔离级别是Read Uncommitted。(跟support作用类似)
2)、如果A事务在B/C执行完后,还有更改数据库的操作,如果更改失败,那么B/C是要回滚的,对于B和C是REQUIRES_NEW(事务已提交)的情况下做不到。
3)、A与B/C方法中,可以修改同一条数据。但是对于REQUIRES_NEW会造成死锁。
4)、对于REQUIRES_NEW,B/C作为内部事务,提交后可以被修改,这会造成A的脏读。
A.service(){
try {
// PROPAGATION_NESTED
B.service();
}catch(Exception e){
// PROPAGATION_NESTED
C.service();
}
update();
}