来源:fangjian0423,

fangjian0423.github.io/2016/10/07/springboot-transaction/

Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。

比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后。

Springboot会构造一个JpaTransactionManager这个事务管理器。

而当我们使用spring-boot-starter-jdbc的时候,构造的事务管理器则是DataSourceTransactionManager。

这2个事务管理器都实现了spring中提供的PlatformTransactionManager接口,这个接口是spring的事务核心接口。

这个核心接口有以下这几个常用的实现策略:

  1. HibernateTransactionManager

  2. DataSourceTransactionManager

  3. JtaTransactionManager

  4. JpaTransactionManager

具体的PlatformTransactionManager继承关系如下:

spring-boot-starter-data-jpa这个starter会触发HibernateJpaAutoConfiguration这个自动化配置类,HibernateJpaAutoConfiguration继承了JpaBaseConfiguration基础类。

在JpaBaseConfiguration中构造了事务管理器:

@Bean

@ConditionalOnMissingBean(PlatformTransactionManager.class)

public PlatformTransactionManager transactionManager() {

return new JpaTransactionManager();

}

spring-boot-starter-jdbc会触发DataSourceTransactionManagerAutoConfiguration这个自动化配置类,也会构造事务管理器:

@Bean

@ConditionalOnMissingBean(PlatformTransactionManager.class)

@ConditionalOnBean(DataSource.class)

public DataSourceTransactionManager transactionManager() {

return new DataSourceTransactionManager(this.dataSource);

}

Spring的事务管理器PlatformTransactionManager接口中定义了3个方法:

// 基于事务的传播特性,返回一个已经存在的事务或者创建一个新的事务

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

// 提交事务

void commit(TransactionStatus status) throws TransactionException;

// 回滚事务

void rollback(TransactionStatus status) throws TransactionException;

其中TransactionDefinition接口表示跟spring兼容的事务属性,比如传播行为、隔离级别、超时时间、是否只读等属性。

DefaultTransactionDefinition类是一个默认的TransactionDefinition实现,它的传播行为是PROPAGATION_REQUIRED(如果当前没事务,则创建一个,否则加入到当前事务中),隔离级别是数据库默认级别。

TransactionStatus接口表示事务的状态,比如事务是否是一个刚构造的事务、事务是否已经完成等状态。

下面这段代码就是传统事务的常见写法:

transaction.begin();

try {

...

transaction.commit();

} catch(Exception e) {

...

transaction.rollback();

} finally {

}

由于spring的事务操作被封装到了PlatformTransactionManager接口中,commit和rollback方法对应接口中的方法,begin方法在getTransaction方法中会被调用。

细心的读者发现文章前面构造事务管理器的时候都会加上这段注解:

@ConditionalOnMissingBean(PlatformTransactionManager.class)

也就是说如果我们手动配置了事务管理器,Springboot就不会再为我们自动配置事务管理器。

如果要使用多个事务管理器的话,那么需要手动配置多个:

@Configuration

public class DatabaseConfiguration {

@Bean

public PlatformTransactionManager transactionManager1(EntityManagerFactory entityManagerFactory) {

return new JpaTransactionManager(entityManagerFactory);

}

@Bean

public PlatformTransactionManager transactionManager2(DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

}

然后使用Transactional注解的时候需要声明是哪个事务管理器:

@Transactional(value="transactionManager1")

public void save() {

doSave();

}

Spring给我们提供了一个TransactionManagementConfigurer接口,该接口只有一个方法返回PlatformTransactionManager。其中返回的PlatformTransactionManager就表示这是默认的事务处理器,这样在Transactional注解上就不需要声明是使用哪个事务管理器了。

参考资料:

  • http://www.cnblogs.com/davidwang456/p/4309038.html

  • http://blog.csdn.net/chjttony/article/details/6528344

看完本文有收获?请转发分享给更多人

SpringBoot 的事务管理相关推荐

  1. springboot+班级事务管理 毕业设计-附源码211622

    基于springboot班级事务管理 摘 要 随着信息科技在全社会的飞速发展与普及,网络技术的日渐成熟,计算机网络技术来实现"无纸办公"这个概念已经深入人心.本系统一班级事务管理相 ...

  2. SpringBoot之事务管理Transactional

    以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...

  3. 基于springboot班级事务管理毕业设计-附源码211622

    摘 要 随着信息科技在全社会的飞速发展与普及,网络技术的日渐成熟,计算机网络技术来实现"无纸办公"这个概念已经深入人心.本系统一班级事务管理相同,就是为了解决学院内繁琐的班级事务而 ...

  4. mybatis plus 事务管理器_SpringBoot第七篇:springboot开启声明式事务

    springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...

  5. SpringBoot+Nacos+Seata实现Dubbo分布式事务管理

    SpringBoot+Nacos+Seata实现Dubbo分布式事务管理 https://www.shangmayuan.com/a/a3ba056126ba45db9b8dfd5b.html 源码下 ...

  6. SpringBoot 事务管理

    事务 事务是对支持事务的关系型数据库中的数据操作的完整性和一致性.所有数据要么一起成功,要么一起失败. 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异 ...

  7. 计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署

    计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署 计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署 ...

  8. SpringBoot+Zookeeper+Seata实现Dubbo分布式事务管理

    面我已经写过一篇SpringBoot+Nacos+Seata实现Dubbo分布式事务管理的文章,今天为什么还要写这篇呢,是因为好多公司还在用Zookeeper作为Dubbo的注册中心和配置中心在大规模 ...

  9. Spring-Boot + Atomikos 实现跨库的分布式事务管理

    一.何为事务 定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作成功,要么都不成功. 其必须遵循的四个原则(ACID): 原子性(Atomicity -- 美 [ˌætəˈ ...

  10. SpringBoot集成AOP管理日志

    写在前面 如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择.使用Spring的AOP功能即可完成. AOP ...

最新文章

  1. 从语句 char* p=test 说起
  2. 心中有“树”:数据结构之树详解
  3. matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
  4. finereport字段显示设置_如何在Excel中显示和编辑中文拼音字段
  5. OllyDbg笔记-软件逆向调试技巧
  6. 源代码管理分析工具 - Source Navigator
  7. linux-0.11内核 任务的堆栈切换
  8. 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
  9. python怎么播放音乐_Python实现在线音乐播放器
  10. 常用命令之svnadmin命令
  11. VIJOS 1547 逆转,然后再见
  12. CF - 472C. Design Tutorial: Make It Nondeterministic 贪心
  13. 计算机程序如何计算除法,在EXCEL表格公式中怎样计算乘积及除法?
  14. Verilog 中的Procedural continuous assignments
  15. 给你个使用NAS私有云服务器的理由
  16. 前端百题斩【006】——js中三类字符串转数字的方式
  17. Java6面向对象编程创建一个矩形类, 求周长 面积
  18. CMD快捷指令之打开磁盘清理工具
  19. 夜深模拟器安装的一些问题
  20. dede(织梦)待审核定更插件

热门文章

  1. 读者教育浏览器兼容解决方法
  2. 阅读《程序员修炼之道-从小工到专家》阅读笔记02
  3. java 四舍五入保留小数
  4. div+css 背景图片的定位取图问题详解
  5. Pr 入门教程,如何倾斜移位效果?
  6. IP Scanner Pro for mac(局域网IP扫描软件)
  7. 如何通过 Apple Watch 解锁 Mac
  8. JS有哪几种传参方式?
  9. 正在经历变革的 Linux 系统管理员技能
  10. for 循环中实现多个点击事件