SpringBoot 的事务管理
来源: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的事务核心接口。
这个核心接口有以下这几个常用的实现策略:
HibernateTransactionManager
DataSourceTransactionManager
JtaTransactionManager
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 的事务管理相关推荐
- springboot+班级事务管理 毕业设计-附源码211622
基于springboot班级事务管理 摘 要 随着信息科技在全社会的飞速发展与普及,网络技术的日渐成熟,计算机网络技术来实现"无纸办公"这个概念已经深入人心.本系统一班级事务管理相 ...
- SpringBoot之事务管理Transactional
以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作: 用来保证一致性,即service方法里的多个dao操作,要 ...
- 基于springboot班级事务管理毕业设计-附源码211622
摘 要 随着信息科技在全社会的飞速发展与普及,网络技术的日渐成熟,计算机网络技术来实现"无纸办公"这个概念已经深入人心.本系统一班级事务管理相同,就是为了解决学院内繁琐的班级事务而 ...
- mybatis plus 事务管理器_SpringBoot第七篇:springboot开启声明式事务
springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...
- SpringBoot+Nacos+Seata实现Dubbo分布式事务管理
SpringBoot+Nacos+Seata实现Dubbo分布式事务管理 https://www.shangmayuan.com/a/a3ba056126ba45db9b8dfd5b.html 源码下 ...
- SpringBoot 事务管理
事务 事务是对支持事务的关系型数据库中的数据操作的完整性和一致性.所有数据要么一起成功,要么一起失败. 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异 ...
- 计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署
计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署 计算机毕业设计springboot教学事务流转与管理平台k0446源码+系统+程序+lw文档+部署 ...
- SpringBoot+Zookeeper+Seata实现Dubbo分布式事务管理
面我已经写过一篇SpringBoot+Nacos+Seata实现Dubbo分布式事务管理的文章,今天为什么还要写这篇呢,是因为好多公司还在用Zookeeper作为Dubbo的注册中心和配置中心在大规模 ...
- Spring-Boot + Atomikos 实现跨库的分布式事务管理
一.何为事务 定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作成功,要么都不成功. 其必须遵循的四个原则(ACID): 原子性(Atomicity -- 美 [ˌætəˈ ...
- SpringBoot集成AOP管理日志
写在前面 如何将所有的通过url的请求参数以及返回结果都输出到日志中? 如果在controller的类中每个方法名都写一个log输出肯定是不明智的选择.使用Spring的AOP功能即可完成. AOP ...
最新文章
- 从语句 char* p=test 说起
- 心中有“树”:数据结构之树详解
- matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
- finereport字段显示设置_如何在Excel中显示和编辑中文拼音字段
- OllyDbg笔记-软件逆向调试技巧
- 源代码管理分析工具 - Source Navigator
- linux-0.11内核 任务的堆栈切换
- 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库
- python怎么播放音乐_Python实现在线音乐播放器
- 常用命令之svnadmin命令
- VIJOS 1547 逆转,然后再见
- CF - 472C. Design Tutorial: Make It Nondeterministic 贪心
- 计算机程序如何计算除法,在EXCEL表格公式中怎样计算乘积及除法?
- Verilog 中的Procedural continuous assignments
- 给你个使用NAS私有云服务器的理由
- 前端百题斩【006】——js中三类字符串转数字的方式
- Java6面向对象编程创建一个矩形类, 求周长 面积
- CMD快捷指令之打开磁盘清理工具
- 夜深模拟器安装的一些问题
- dede(织梦)待审核定更插件