2.如何在代码中控制事务
2.1.JDBC事务代码
JDBC 默认是自动提交操作, 要开启事务就要先关闭自动提交
在多次数据操作过程中, 如果出现操作失败就要回滚
只有所有的操作都成功了才将所有的操作结果提交
conn.setAutoCommit(false); //开辟缓冲区---不自动提交Connection
for (int i = 0; i < sqls.length; i++){
int tiao=stmt.executeUpdate(sqls[i]); //根据返回的结果判定操作是否成功
if (tiao==0 ) {
conn.rollback();//回滚
return; //回滚同时一定要结束程序,不能再向后面执行
}
}
conn.commit(); //提交
2.2.Springboot 项目中使用事务
2.2.1.两个步骤
1,在启动类中加注解开启事务功能
@EnableTransactionManagement
2, 在要执行事务的类中加入事务管理注解
@Transactional(rollbackFor = Exception.class)
放在方法上, 则方法具有事务的功能
放在类上, 则类里的所有方法都具有事务的功能
2.2.2. 为什么要设置rollbackFor
Springboot默认只对运行时异常(RuntimeException)有回滚机制, 其他异常发生时不能回滚,
如果想让所有异常都回滚,则必须设置rollbackFor=Exception.class或者rollbackFor=Throwable.class
问题? 查询方法时不需要事务的,怎么取消呢?
在查询方法上加入如下注解即可.
@Transactional(propagation = Propagation.NOT_SUPPORTED)
2.2.3.事务传播类型
传播行为主要针对实际开发中的问题
Propagation 七种传播行为:
名称 | 描述 |
---|---|
REQUIRED | 支持当前事务,如果不存在,就新建一个 |
SUPPORTS | 支持当前事务,如果不存在,就不使用事务 |
MANDATORY | 支持当前事务,如果不存在,抛出异常 |
REQUIRES_NEW | 如果有事务存在,挂起当前事务,创建一个新的事务 |
NOT_SUPPORTED | 以非事务方式运行,如果有事务存在,挂起当前事务 |
NEVER | 以非事务方式运行,如果有事务存在,抛出异常 |
NESTED | 如果当前事务存在,则嵌套事务执行(嵌套式事务) |
这七种事务传播机制最常用的:
REQUIRED:一个事务,要么成功,要么失败
REQUIRES_NEW:两个不同事务,彼此之间没有关系。一个事务失败了不影响另一个事务
NOT_SUPPORTED : 挂起当前事务, 不启动事务
2.2.4.@Transactional注解使用时的注意事项
1, 同一个类内方法a调用方法b,则方法b上的事务不生效.
2, 方法必须是public才行
3, 方法内如果用了try catch,则catch捕获的异常,不会发生回滚.
版权声明:本文为yuanchun05原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。