一、Spring事务相关配置
属性 | 作用 | 示例 |
readOnly | 设置是否为只读事务 | readOnly=true 只读事务 |
timeout | 设置事务超时时间 | timeout= -1(永不超时) |
rollbackFor | 设置事务回滚异常(class) | rollbackFor=(NullPointException.class) |
rollbackForClassName | 设置事务回滚异常(String) | 同上格式为字符串 |
noRollbackFor | 设置事务不回滚异常(class) | noRollbackFor=(NullPointException.class) |
noRollbackForClassName | 设置事务不回滚异常(String) | 同上格式为字符串 |
propagtion | 设置事务传播行为 | ...... |
Spring事务只对RuntimeException()异常或是其子类进行事务回滚,其他异常不回滚,需要回滚,需要rollbackFor手动设置事务回滚。
二、案例:转账业务追加日志
需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕
需求微缩:A账户减钱,B账户加钱,数据库记录日志
分析:
1、基于转账案例添加日志模块,实现数据库中记录日志
2、业务层转账操作(transfer),调用减钱、加钱与记录日志功能
实现效果预期:
无论转账操作是否成功,均进行转账操作的日志留痕
存在的问题:
日志的记录与转账操作隶属同一事务,同成功同失败
实现效果预期改进:
无论转账操作是否成功,日志必须保留
在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事物)
@Service public class LogServiceImpl implements LogService { @Autowired private LogDao logDao; //propagation设置事务属性:传播行为设置为当前操作需要新事务 @Transactional(propagation = Propagation.REQUIRES_NEW) public void log(String out,String in,Double money ) { logDao.log("转账操作由"+out+"到"+in+",金额:"+money); } }
基于转账案例添加日志模块,实现数据库中记录日志
(4条消息) Spring事务简介及案例:模拟银行账号间转账业务_夏志121的博客-CSDN博客
https://blog.csdn.net/m0_61961937/article/details/125359666?spm=1001.2014.3001.5501
import org.apache.ibatis.annotations.Insert; public interface LogDao { @Insert("insert into tbl_log (info,createDate) values(#{info},now())") void log(String info); }
三、Spring事务传播行为
传播属性 | 事务管理员 | 事务协调员 |
REQUIRED(默认) | 开启T | 加入T |
无 | 新建T2 | |
REQUIRES_NEW | 开启T | 新建T |
无 | 新建T2 | |
SUPPORTS | 开启T | 加入T |
无 | 无 | |
NOT_SUPPORTED | 开启T | 无 |
无 | 无 | |
MANDATORY | 开启T | 加入T |
无 | ERROR | |
NEVER | 开启T |
ERROR |
无 | 无 | |
NESTED | 设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚 |