Springboot、Mybatis 事务示例
2019独角兽企业重金招聘Python工程师标准>>>
摘要
这篇文章主要记录Springboot下单数据源、多数据源配置,以及事务的常见属性配置。重点理解事务的隔离级别、传播属性。
配置示例
单数据源配置
参数配置
#datasource
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://*******:3306/imass_union_pay?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
spring.datasource.username=****
spring.datasource.password=***
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver #druidDataSource
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.druid.filters=stat,wall,cat
事务开启配置
@Configuration
//mapper路径
@MapperScan(basePackages = { "com.imassbank.unionpay.dal.mapper" })
//启用事物管理 ,在需要事物管理的service类或者方法上使用注解@Transactional
@ConditionalOnBean(ReloadablePropertiesFactoryBean.class)
@EnableTransactionManagement
public class MybatisConfiguration {@Autowiredprivate DataSource dataSource;/*** 配合注解完成事物管理* @return*/@Beanpublic PlatformTransactionManager annotationDrivenTransactionManager() {return new DataSourceTransactionManager(dataSource);}
}
多数据源
参考:SpringBoot2.0之八 多数据源配置
使用示例
@Transactional(value="事务名称,多数据源就是具体数据源对应的事务名称" propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)public Long addOrderRepay(ImassOrderRepay orderRepay) {//TODO}
属性介绍
事务传播行为介绍
事务的传播行为,默认值为 Propagation.REQUIRED。
- Propagation.REQUIRED
如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
- Propagation.SUPPORTS
如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
- Propagation.MANDATORY
如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
- Propagation.REQUIRES_NEW
重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
- Propagation.NOT_SUPPORTED
以非事务的方式运行,如果当前存在事务,暂停当前的事务。
- Propagation.NEVER
以非事务的方式运行,如果当前存在事务,则抛出异常。
- Propagation.NESTED
和 Propagation.REQUIRED 效果一样。
事务超时设置介绍
@Transactional(timeout=-1) //单位是秒,默认是没有超时时间的,依赖于底层数据库超时时间。
事务隔离级别介绍
事务的隔离级别,默认值为 Isolation.DEFAULT。
- Isolation.DEFAULT
使用底层数据库默认的隔离级别。也就是底层数据库支持什么样的隔离级别就用什么样的隔离级别。
- Isolation.READ_UNCOMMITTED
读取未提交数据(会出现脏读, 不可重复读) 基本不使用。
- Isolation.READ_COMMITTED
读取已提交数据(会出现不可重复读和幻读)
- Isolation.REPEATABLE_READ
可重复读(会出现幻读)
- Isolation.SERIALIZABLE
串行化.就是事务必须一个一个的串行执行,不会发生脏读、不可重复读、幻读。这种事务隔离级别最高,一般行级锁是无法实现的。更详细的参考 【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)
MYSQL: 默认为REPEATABLE_READ级别
SQLSERVER: 默认为READ_COMMITTED
ORACLE: 默认为READ_COMMITTED
脏读 :
一个事务读取到另一事务未提交的更新数据
不可重复读 :
在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次 读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 :
一个事务读到另一个事务已提交的insert数据
注意事项
- 默认事务回滚,是RuntimeException,不是所有的Exception。受检的exception是不会回滚的。异常类型参考 Java异常。如果想要对其它类型的异常也能回滚,则需要@Transactional(rollbackFor=Exception.class)的rollbackFor属性上制定回滚的异常类型。如果针对某些异常类型,不想回滚,可在noRollbackFor属性配置
- 默认超时时间没有限制(-1),依赖数据库层的事务超时时间。原注释是:Defaults to the default timeout of the underlying transaction system。如果要设置,单位是秒。
- 事务注解只能加在public方法上,对于其它的非public方法,加上没有报错,但是也不会生效。如 protected、private、package-visible的方法上加的@Transactional注解都不会生效。
- @Transactional注解可以加在接口定义、接口方法上,也可以加在类上和类的public方法上。
- @Transactional注解是不能继承的,所以必须加在具体的子类或者子类方法上,父类的注解是不能被继承的。
事务的其它属性介绍
@Transactional注解中常用参数说明
| 参数名称
|
功能描述
| |
readOnly
|
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
| |
rollbackFor
|
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
| |
rollbackForClassName
|
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:
指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")
指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})
| |
noRollbackFor
|
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:
指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
| |
noRollbackForClassName
|
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")
指定多个异常类名称:
@Transactional(noRollbackForClassName={"RuntimeException","Exception"})
| |
propagation
|
该属性用于设置事务的传播行为,具体取值可参考表6-7。
例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
| |
isolation
|
该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
| |
timeout
|
该属性用于设置事务的超时秒数,默认值为-1表示永不超时
|
案例
参考文档
【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)
Spring Boot 中使用 @Transactional
注解配置事务管理
SpringBoot2.0之八 多数据源配置
Spring中@Transactional事务回滚
spring @Transactional注解参数详解
转载于:https://my.oschina.net/liangxiao/blog/2994824
Springboot、Mybatis 事务示例相关推荐
- springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存
"IT魔幻屋"致力于让你遇见更好的自己! 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java ...
- 记一次springboot+mybatis事务无效的处理
代码虐我千百遍,我待代码如初恋 问题背景: springboot + mybatis, 多数据源, 事务无法回滚 网上查阅了各种博客 第一种说法(个人觉得这个真的非常规): mapper.xml文件中 ...
- SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))
快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos 特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...
- 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了. 下面列举两种常用的场景: 一种是读写分离的数据源,例如一个读库和一个写库,读库负责各 ...
- DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...
DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载 系列目录连接 DB数据源之Spr ...
- ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置
一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...
- MyBatis事务管理解析:颠覆你心中对事务的理解
MyBatis事务管理解析:颠覆你心中对事务的理解! 1 .说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性.四大隔离级别.七大传播特性. 四大还好说,问题是七大传播特性是哪儿来的?是S ...
- SpringBoot+Mybatis配置Druid多数据源
开篇之前,说一句题外话.多数据源和动态数据源的区别. 多数据源,一般用于对接多个业务上独立的数据库(可能异构数据库). 动态数据源,一般用于大型应用对数据切分. 配置参考 如何配置多数据源,网上教程一 ...
- SpringBoot + MyBatis(注解版),常用的SQL方法
一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...
最新文章
- PL/SQL 使用文档——表注释、显示乱码
- 数据库_7_SQL基本操作——表操作
- 【离散数学】二元关系的闭包
- linux 正则查找email_Linux--正则表达式--详解
- [转] 81条经典话语~~~当裤子失去皮带,才懂得什麽叫做依赖
- 交换机端口呈现err-disable的原因
- python绘制国际象棋规则口诀_用Python编写一个国际象棋AI程序
- SQL:postgresql中实现查询某字段总数量和该字段不同值各自的数量
- Atitit 物化视图与触发器性能测试方法 attilax总结 1.1. 触发器主要影响更新性能。。。	1 1.2. 临时打开关闭触发器,如果db不支持可以更改条件使其不触发	1 1.3. 打开定时
- android hd 输入法,Android上好用的Lime HD中文输入法03--更好的使用篇
- 焕然一新的 Vue 3 中文文档来了,附送50张学习思维图
- 数据库表结构设计,什么是概念模型、逻辑模型、物理模型
- 2018年清华大学民商法学考研经验分享
- 软件测试怎么学比较快
- (转载)NPOI使用手册,实践发现使用2.2版本的库需要稍作调整
- 微信卡券领用中的问题
- 航班时间(第九届蓝桥杯省赛C++A组)
- Linux如何让程序在后台运行
- [多图]输入法漏洞再现Windows 8 利用QQ拼音纯净版实现提权
- RealView MDK中(volatitle unsigned *)(0x40005c00)的理解