事务传播机制:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的。 上篇博客讲到的事务隔离级别能解决多个事务同时调用一个数据库的问题。
事务传播机制解决的是⼀个事务在多个方法中传递的问题。

@Transactional 注解⽀持事务传播机制的设置,通过 propagation 属性来指定传播行为
Propagation.REQUIRED:默认的事务传播机制,如果当前存在事务,则加入该事务;如果当前没有事务,则创建应该新的事务Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏Propagation.MANDATORY:强制性,如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常Propagation.REQUIRES_NEW:创建一个新事务。如果当前存在事务,把当前事务挂起;不管外部方法是否开启事务,Propagation.REQUIRES_NEW修饰的方法都会开启新事务,二者互不干扰。Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 Propagation.REQUIRED。@Transactional
public void tansfer(){//开启事务
updateAcount();//调用
log();//调用
}
@Transactional(propagation = Propagation.SUPPORTS)
public void getUserInfo(){
//查询用户信息
}
//被普通方法调用
public void fun(){
getUserInfo();//非事务方法运行
}
//被事务方法调用
@Transactional
public void funs(){
getUsetInfo();//加入事务
}
@Transactional
public void buy(){
gift();//必须在事务中
}
@Transactional(propagation = Propagation.MANDATORY)
public void gift(){
//赠品
}
public void buyGift(){
gift();//抛出异常
}
@Transactional
public void tansfer(){//开启事务
updateAcount();//调用
log();//调用
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(){
//记录日志
}
@Transactional
public void decorateHouse() {
// ... 核心操作
paintWall(); // 刷墙(在事务内)
buytools();//买工具
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void buytools() {
// ... 买工具,这个操作不在任何事务中
}
@Transactional(propagation = Propagation.NEVER)
public void readOnly() {
// ... 只读操作
}
@Transactional
public void processOrder() {
// ... 订单主逻辑
try {
processItem1(); // 处理商品1 (NESTED)
} catch (Exception e) {
// 只回滚这个商品的操作,其他商品继续处理
}
try {
processItem2(); // 处理商品2 (NESTED)
} catch (Exception e) {
// 只回滚这个商品的操作
}
}
@Transactional(propagation = Propagation.NESTED)
public void processItem1() {
// ... 处理第一个商品
}
事务:
Spring事务管理:
DataSourceTransactionManager@Transactional):业务代码不受事务代码污染关键性配置:
READ_UNCOMMITTED:读未提交(最低隔离,有脏读)
READ_COMMITTED:读已提交(Oracle默认,解决脏读)
REPEATABLE_READ:可重复读(MySQL默认,解决不可重复读)
SERIALIZABLE:串行化(最高隔离,解决幻读)
Spring事务传播机制:
Spring事务传播机制就像管理多个团队协作的规则,定义了各个团队(事务方法)如何独立工作、如何协作、出现问题时的责任边界,确保整个项目(业务)能够正确、高效地完成。