数据库事务( 四 ) 项目中如何使用事务

  • Post author:
  • Post category:其他

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 版权协议,转载请附上原文出处链接和本声明。