spring事务,代码验证
Spring框架几乎是Java的必备工具,掌握事务机制非常重要,以应对不同场景的业务需要。
Spring 事务(Spring Transaction)是 Spring 框架中对事务管理的封装,用于保证数据的一致性、完整性,尤其在操作数据库时尤为重要。它支持 声明式事务管理 和 编程式事务管理 两种方式,其中最常用的是基于注解的声明式事务。
事务注解详解
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
rollbackFor = Exception.class
)
属性 | 说明 |
---|---|
propagation |
事务的传播行为(默认 REQUIRED ) |
isolation |
事务的隔离级别(默认 DEFAULT ) |
timeout |
超时时间,单位为秒 |
readOnly |
是否只读,优化性能 |
rollbackFor |
指定哪些异常触发回滚 |
传播行为(Propagation)
类型 | 含义 |
---|---|
REQUIRED |
如果有事务就加入,没有就新建(默认) |
REQUIRES_NEW |
总是新建一个事务,原事务挂起 |
NESTED |
如果当前存在事务,则嵌套事务 |
SUPPORTS |
有事务就用,没有就非事务执行 |
NOT_SUPPORTED |
始终非事务执行 |
NEVER |
如果存在事务就抛出异常 |
MANDATORY |
必须存在事务,否则抛异常 |
写代码来验证。
0、搭建环境
springboot + MySQL + mybatisplus
1、目录结构
启动后,访问地址:http://localhost:8080/api/user/insert
2、主要代码
//UserDoServiceA调用UserDoServiceB,根据测试场景调整@Transactional的传播行为 // @Transactional public String insertA() { UserDo userDo = new UserDo(); userDo.setName("A"); log.info("UserDoServiceA"); userDo.insert(); log.info("UserDoServiceB"); userDoServiceB.insertB(); return "yes"; } //@Transactional(propagation = Propagation.MANDATORY) public String insertB() { UserDo userDoB = new UserDo(); userDoB.setName("B"); userDoB.insert(); int a = 2 / 0; return "yes"; }
3、各个传播机制的验证,在文件readme.md
代码地址:https://github.com/hannibal2017/java-project/tree/main/spring-transaction
事务原理
Spring AOP增强实现的
事务失效
1、方法不是public,而是private、protected;2、类内部调用,比如this.方法;3、异常处理;等等。参考:https://cloud.tencent.com/developer/article/1876768