Spring事务需要注意的几个点

270 阅读1分钟

关于事务我的头脑里总是萦绕着三点

  • 一是,我的事务是否开启。
  • 二是,事务的传播行为,如果有新的事务加入spring会怎么处理。
  • 三是,如果一个没有事务的方法调有事务的方法,有事务的方法会被事务包含吗。

第一个问题:

    在Spring Boot中,只要是Service里面的公共方法,只要添加@Transaction注解,即会被纳入Spring事务管理。数据库层面的事务会被DataSourceTransactionManager类所管理。debug调试可以在doBegin、doCommit、doRollback方法添加断点观察其是否执行。

第二个问题:

    事务的传播行为,如果是默认的,即只添加@Transaction注解,而不修改其属性,则调用另一个被这个注解修饰的方法,则不会开启新事务,而是加入旧的事务,待主方法执行完,则提交全部修改。

第三个问题:

    如果一个没有被@Transaction注解修饰的方法调被@Transaction注解修饰的方法。被调用方法依然会被事务增强。原因是调用者调用的不是原始方法,而是调用的spring动态代理生成之后的方法。如果是本类之间的调用,则动态代理失效,被调用的方法不会被事务包含。