2019-08-05 11:48:54 卢浮宫 版权声明:本文为站长原创文章,转载请写明出处
最近频繁使用事务,所以这里补充一遍关于springboot生命是事务的文章
1、springboot声明式事务是建立在aop的基础上的,其本质是对方法前后进行拦截然后在方法开始之前创建一个事务,
在方法结束后根据运行情况进行事务提交或回滚。
2、声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,
只需在配置文件中做相关的事务规则声 明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
①在springboot启动类中加入如下注解 @EnableTransactionManagement
②在业务实现类中使用 @Transactional()来声明事务
1、propagation 事务的传播行为,默认值为 REQUIRED
2、islation 事务的隔离级别,默认值为 DEFAULT
4、read-only 指定事务是否为只读事务,默认false。为了忽略一些不需要事务的方法,比如数据库的读取,这是可以设置为true
5、rollbackFor 事务的回滚针对那些异常情况
1、在业务接口实现类中使用
2、在私有方法上使用是不生效的(即使你声明了)
3、可以再类上进行声明,也可以在类中的方法上声明
4、类内部访问时不生效(不去直接访问一个带有注解的方法,而是把方法当做被调用方去处理)
5、正常的try catch使用时,要在捕获异常后手动抛出runtime异常,不然事务部回滚
6、异常不匹配时会回滚
7、数据源不支持事务处理(mysql 的 MyISAM 引擎就不支持事务,而 Innodb 支持事务)
当有平行业务处理时,建议做一个前置处理。把业务拆分进行分次处理,需要有事务的和不需要有事务的单独操作。
PS:当一个接口的业务:
1、需要有个数据信息的记录,同时有一个数据处理。
2、这个数据记录时insert操作,不收事务影响(回滚时不去删除)
3、这个数据处理因为比较敏感要做事务处理(异常操作时进行回滚)
解决方案伪代码如下(不要堆积在controller中):
{
业务A处理(数据信息记录,不需要加事务)
业务B处理(数据处理,需要增加事务)
}