事务 传播行为
事务特性
原子性:事务最小的工作单元,不可再分
隔离性:事物之间相互隔离,保证互不干扰
一致性:事务要求要么同时成功,要么同时失败
持久性:持久性是事务结束的标志
spring事务传播行为
-
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
-
REQUIRES_NEW:新建事务。如果当前已存在一个事务,那么该事务将被挂起,直到新的事务执行完毕。如果没有当前事务,那么就会创建一个新的事务来执行。
-
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,直到非事务方式执行完毕。
-
MANDATORY:使用当前事务,如果当前没有事务,就抛出异常IllegalTransactionStateException。
-
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常IllegalTransactionStateException。
-
NESTED:嵌套事务,如果当前存在事务,则在嵌套事务内执行。如果没有事务,则新建一个事务(REQUIRES_NEW)。
@Service("actServiceImpl")
public class ActServiceImpl1{
@Resource(name = "actDaoImpl")
private ActDao actDao;
@Resource(name = "actServiceImpl2")
private ActService actService2;
@Transactional(propagation = Propagation.REQUIRED)
void add1(){
actDao.add(new Act("3", 10000));
actService2.add();
}
@Transactional(propagation = Propagation.REQUIRED)
void add2(){
actDao.add(new Act("3", 10000));
try {
actService2.add();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@Service("actServiceImpl2")
public class ActServiceImpl2{
@Resource(name = "actDaoImpl")
private ActDao actDao;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void add() {
actDao.add(new Act("4", 10000));
//只有表格中标记①②i=1/0处注释。
//加入此处报错,会影响Act3号的的插入吗
int i = 1 / 0;
}
}
ActServiceImpl1(A) | ActServiceImpl2(B) | add1() | add1()原因 | add2() | add2()原因 |
---|---|---|---|---|---|
REQUIRED | REQUIRED | A×,B× | 同一事务原子性操作,和B是否捕获异常无关 | A×,B× | |
REQUIRED | REQUIRES_NEW | A×,B× | AB各自有事务,A事务内调用B事务,B事务异常导致A异常。 | A√,B× | AB各自有事务,A事务内调用B事务,B捕获异常,A正常插入 |
REQUIRED | PSUPPORTS | A×,B× | 同一事务原子性操作,和B是否捕获异常无关 | A×,B× | |
无事务 | SUPPORTS | A√,B√ | A、B都是非事务操作 | A√,B√ | |
REQUIRED | NOT_SUPPORTED | A×,B√ | A事务方式,B以非事务方式加入A事务,影响A事务。 | A√,B√ | A事务方式,B以非事务方式加入A事务,B异常捕获,所以AB都插入成功。 |
无事务 | NOT_SUPPORTED | A√,B√ | A、B都是非事务操作 | A√,B√ | A、B都是非事务操作 |
无事务 | MANDATORY | A√,B× | B必须加入已有事务中,否则IllegalTransactionStateException① | ①此处测试把i=1/0注释 | |
REQUIRED | MANDATORY | A×,B× | 同一事务原子性操作,和B是否捕获异常无关 | ||
REQUIRED | NEVER | A×,B× | B不能加入已有事务中,否则IllegalTransactionStateException② | A√,B× | ②此处测试把i=1/0注释 |
无事务 | NEVER | A√,B√ | A、B都是非事务操作 | A√,B√ | |
REQUIRED | NESTED | A×,B× | B嵌套在A事务中,B异常导致A异常 | A√,B× | B嵌套在A事务中,B捕获异常 |
无事务 | NESTED | A√,B× | A非事务操作,B事务新建一个事务,事务内运行。 | A√,B× |