SpringBoot声明式事务的简单运用

2021-06-07  本文已影响0人  山巅自相见

所谓事务,单个逻辑工作单元执行的一系列操作,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
SpringBoot声明事务有两种方式:第一种是配置xml,第二种是使用相关注解。SpringBoot中默认配置了第二种方式,所以直接使用注解即可。

SpringBoot使用事务的步骤

第一步:在启动类上开启事务支持

@SpringBoorApplication
@EnableTransactionManagement // 开启事务支持

提示:@EnableTransactionManagement注解其实在大多数情况下,不是必须的,因为SpringBoot在TransactionAutoConfiguration类里为我们自动配置启动了@EnableTransactionManagement注解。
本人建议写一下。

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

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)

@Transactional注解常用属性

属性 说明
propagation 事务的传播行为默认值为REQUIRED
isolation 事务的隔离度,默认值采用DEFAULT
timeout 事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该事件限制了但事务还没有完成,则自动回滚事务。
read-only 指定事务是否为只读事务,默认值为false;为了忽略那些不需要事务的方法,必须只读取数据,可以设置read-only为true。
rollbackFor 用于指定能够触发事务回滚的异常类型,如果多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class, ......}
noRollbackFor 抛出no-rollback-for指定的异常类型,不回滚事务。{xxx1.class, xxx2.class, ......}
......

注意事项

事务的传播机制(行为)

事务的传播机制行为是指,如果咋开始当前事务之前,一个事务上下文已经存在了,此时有若干选项可以指定一个事务性方法的执行行为。即:再说执行一个@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),可以吗? 可以

......

上一篇 下一篇

猜你喜欢

热点阅读