springboot声明式事务简要说明

2019-08-05 11:48:54  卢浮宫  版权声明:本文为站长原创文章,转载请写明出处


一、背景

最近频繁使用事务,所以这里补充一遍关于springboot生命是事务的文章


二、springboot声明式事务机制

    1、springboot声明式事务是建立在aop的基础上的,其本质是对方法前后进行拦截然后在方法开始之前创建一个事务,

    在方法结束后根据运行情况进行事务提交或回滚。

    2、声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,

    只需在配置文件中做相关的事务规则声 明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。


三、这里使用的是注解方式,下面会贴出使用方法和注意事项

    ①在springboot启动类中加入如下注解   @EnableTransactionManagement

    ②在业务实现类中使用  @Transactional()来声明事务


四、相关参数释义

    1、propagation 事务的传播行为,默认值为 REQUIRED

    2、islation 事务的隔离级别,默认值为 DEFAULT

    3、timeout 超时时间,单位S,默认值为-1(不超时)。PS:设置后超时回滚

    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处理(数据处理,需要增加事务)

    }

    

    




更多精彩请关注guangmuhua.com


最新评论: