首页 > 编程知识 正文

springboot配置事务事务,java transaction注解

时间:2023-05-06 03:39:36 阅读:147274 作者:4368

关于事物的基本概念等在这里不做介绍。

Spring宣言性的东西的实现有两种方法; 第一个是设置xml,另一个是使用相关注释。 关于这两种方法,请参阅《程序员成长笔记(一)》的相关章节。 默认情况下,SpringBoot包含第二种方法,因此SpringBoot可以按原样使用注释。 介绍SpringBoot在评论中打开事物的使用。

使用SpringBoot事物的步骤:第一步:在启动类上开启事物支持

提示: @EnableTransactionManagement注释显示SpringBoot为

在TransactionAutoConfiguration类中,为自动配置启用了@EnableTransactionManagement注释

解开。 但是,要自动启用此注释,有两个先决条件:

@ conditionalonbean (platformtransactionmanager.class ) )。

与@ conditionalonmissingbean (abstracttransactionmanagementconfiguration.class )一起

一般来说,这两个条件都符合,所以一般不写在启动类中

@EnableTransactionManagement也可以。 我建议这里还是写。

第二步:在业务逻辑层接口的实现类中的相关方法上声明事物

提供Transactional注释的常规属性工作表:属性

说明

传播

的传播动作。 默认值为REQUIRED。

解决方案

事务的分离度。 默认值为默认值

时间退出

的事务超时时间。 默认值为-1,不超时。

如果设置了超时时间(以秒为单位),并且事务尚未完成,则事务将自动回滚。

只读存储器

指定事务是否为只读,默认值为false; 若要忽略不需要事务的方法(如数据加载),请将只读设置为真。

rollbackFor

指定可以触发事务回滚的异常类型。 如果需要指定多个异常类型,则可以用逗号分隔类型。 {xxx1.class,xxx2.class,…}

noRollbackFor

抛出no-rollback-for指定的异常类型,而不回滚事务。 {xxx1.class,xxx2.class,…}

.

注意事项:service实现类(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。

Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com

注:

SQL异常属于检查异常(有的框架将SQL异常重写为了运行时异常),但是有时我们写SQL时,检查异常并
       不会提示;而默认情况下,事物对检查异常不会作出回滚处理。
注:在很多时候,我们除了catch一般的异常或自定义异常外,我们还习惯于catch住Exception异常;然后再抛出
        Exception异常。但是Exception异常属于非运行时异常(即:检查异常),因为默认是运行时异常时事物才进
        行回滚,那么这种情况下,是不会回滚的。我们可以在@Transacional注解中,通过
        
rollbackFor = {Exception.class} 来解决这个问题。即:设置当Exception异常或Exception的所有任意子
        类异常时事物会进行回滚

注:被catch处理了的异常,不会被事物作为判断依据;如果异常被catch 了,但是又在catch中抛出了新的异
       常,那么事物会以这个新的异常作 为是否进行回滚的判断依据。

事务的传播机制(行为)

      事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

 即:在执行一个@Transactinal注解标注的方法时,开启了事务;当该方法还在执行中时,另一个人也触发了该方法;
         那么此时怎么算事务呢,这时就可以通过事务的传播机制来指定处理方式。

在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

常量

含义

TransactionDefinition.PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW

创建一个新的事务,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

以非事务方式运行,如果当前存在事务,则把当前事务挂起。

TransactionDefinition.PROPAGATION_NEVER

以非事务方式运行,如果当前存在事务,则抛出异常。

 

TransactionDefinition.PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

TransactionDefinition.PROPAGATION_NESTED

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事务补充:

        同一个事务里面,对某一条数据的增删改、 都会影响到这个事务里面接下来的对这个条数的增删改查,如(举例部分情况):

示例

结论

一个事务里面,debug未完成时, 数据会入库吗?

不会

一个事务里面,执行一半时,程序莫名停了,数据会回滚吗?

同一个事务里面,插入(数据a) -> 查询(数据a) -> 修改(数据a) -> 插入(数据a),可以吗?

可以

同一个事务里面,插入(数据a) -> 修改(数据a) -> 再次修改(数据a) -> 查询(数据a),可以吗?

可以

同一个事务里面,插入(数据a) -> 修改(数据a) -> 删除(数据a),可以吗?

可以

……

 

阿里piapia规范推荐:

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

如:使用

代替:

阿里推荐的方式属于自动提交/手动回滚,那如果我们想要手动提交、手动回滚的话,可参考:

注:不需要@Transactional注解。

使用声明式注解时,除了抛出异常外,我们还可以主动设置事务需要回滚:

 

 

^_^ 参考链接:
           https://blog.csdn.net/KokJuis/article/details/78560814
           http://www.voidcn.com/article/p-bozwatyd-st.html
           https://www.ibm.com/de...actional-use/ ^_^ 如有不当之处,欢迎指正 ^_^ 本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。