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。

  1. Propagation.REQUIRED

如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

  1. Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

  1. Propagation.MANDATORY

如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

  1. Propagation.REQUIRES_NEW

重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

  1. Propagation.NOT_SUPPORTED

以非事务的方式运行,如果当前存在事务,暂停当前的事务。

  1. Propagation.NEVER

以非事务的方式运行,如果当前存在事务,则抛出异常。

  1. Propagation.NESTED

和 Propagation.REQUIRED 效果一样。

事务超时设置介绍

@Transactional(timeout=-1) //单位是秒,默认是没有超时时间的,依赖于底层数据库超时时间。

事务隔离级别介绍

事务的隔离级别,默认值为 Isolation.DEFAULT。

  1. Isolation.DEFAULT

使用底层数据库默认的隔离级别。也就是底层数据库支持什么样的隔离级别就用什么样的隔离级别。

  1. Isolation.READ_UNCOMMITTED

读取未提交数据(会出现脏读, 不可重复读) 基本不使用。

  1. Isolation.READ_COMMITTED

读取已提交数据(会出现不可重复读和幻读)

  1. Isolation.REPEATABLE_READ

可重复读(会出现幻读)

  1. Isolation.SERIALIZABLE

串行化.就是事务必须一个一个的串行执行,不会发生脏读、不可重复读、幻读。这种事务隔离级别最高,一般行级锁是无法实现的。更详细的参考 【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)

MYSQL: 默认为REPEATABLE_READ级别

SQLSERVER: 默认为READ_COMMITTED

ORACLE: 默认为READ_COMMITTED

脏读 :

一个事务读取到另一事务未提交的更新数据

不可重复读 :

在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次 读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据

幻读 :

一个事务读到另一个事务已提交的insert数据

注意事项

  1. 默认事务回滚,是RuntimeException,不是所有的Exception。受检的exception是不会回滚的。异常类型参考 Java异常。如果想要对其它类型的异常也能回滚,则需要@Transactional(rollbackFor=Exception.class)的rollbackFor属性上制定回滚的异常类型。如果针对某些异常类型,不想回滚,可在noRollbackFor属性配置
  2. 默认超时时间没有限制(-1),依赖数据库层的事务超时时间。原注释是:Defaults to the default timeout of the underlying transaction system。如果要设置,单位是秒。
  3. 事务注解只能加在public方法上,对于其它的非public方法,加上没有报错,但是也不会生效。如 protected、private、package-visible的方法上加的@Transactional注解都不会生效。
  4. @Transactional注解可以加在接口定义、接口方法上,也可以加在类上和类的public方法上。
  5. @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表示永不超时

|

案例

参考文档

  1. 【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)

  2. Spring Boot 中使用 @Transactional

  3. 注解配置事务管理

  4. SpringBoot2.0之八 多数据源配置

  5. Spring中@Transactional事务回滚

  6. spring @Transactional注解参数详解

转载于:https://my.oschina.net/liangxiao/blog/2994824

Springboot、Mybatis 事务示例相关推荐

  1. springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存

    "IT魔幻屋"致力于让你遇见更好的自己! 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java ...

  2. 记一次springboot+mybatis事务无效的处理

    代码虐我千百遍,我待代码如初恋 问题背景: springboot + mybatis, 多数据源, 事务无法回滚 网上查阅了各种博客 第一种说法(个人觉得这个真的非常规): mapper.xml文件中 ...

  3. SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))

    快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos  特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...

  4. 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务

    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了. 下面列举两种常用的场景: 一种是读写分离的数据源,例如一个读库和一个写库,读库负责各 ...

  5. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描...

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

  6. ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置

    一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...

  7. MyBatis事务管理解析:颠覆你心中对事务的理解

    MyBatis事务管理解析:颠覆你心中对事务的理解! 1 .说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性.四大隔离级别.七大传播特性. 四大还好说,问题是七大传播特性是哪儿来的?是S ...

  8. SpringBoot+Mybatis配置Druid多数据源

    开篇之前,说一句题外话.多数据源和动态数据源的区别. 多数据源,一般用于对接多个业务上独立的数据库(可能异构数据库). 动态数据源,一般用于大型应用对数据切分. 配置参考 如何配置多数据源,网上教程一 ...

  9. SpringBoot + MyBatis(注解版),常用的SQL方法

    一.新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码 <dependency> <groupId>org.mybatis.spring ...

最新文章

  1. PL/SQL 使用文档——表注释、显示乱码
  2. 数据库_7_SQL基本操作——表操作
  3. 【离散数学】二元关系的闭包
  4. linux 正则查找email_Linux--正则表达式--详解
  5. [转] 81条经典话语~~~当裤子失去皮带,才懂得什麽叫做依赖
  6. 交换机端口呈现err-disable的原因
  7. python绘制国际象棋规则口诀_用Python编写一个国际象棋AI程序
  8. SQL:postgresql中实现查询某字段总数量和该字段不同值各自的数量
  9. Atitit 物化视图与触发器性能测试方法 attilax总结 1.1. 触发器主要影响更新性能。。。 1 1.2. 临时打开关闭触发器,如果db不支持可以更改条件使其不触发 1 1.3. 打开定时
  10. android hd 输入法,Android上好用的Lime HD中文输入法03--更好的使用篇
  11. 焕然一新的 Vue 3 中文文档来了,附送50张学习思维图
  12. 数据库表结构设计,什么是概念模型、逻辑模型、物理模型
  13. 2018年清华大学民商法学考研经验分享
  14. 软件测试怎么学比较快
  15. (转载)NPOI使用手册,实践发现使用2.2版本的库需要稍作调整
  16. 微信卡券领用中的问题
  17. 航班时间(第九届蓝桥杯省赛C++A组)
  18. Linux如何让程序在后台运行
  19. [多图]输入法漏洞再现Windows 8 利用QQ拼音纯净版实现提权
  20. RealView MDK中(volatitle unsigned *)(0x40005c00)的理解

热门文章

  1. 前沿报告|AI系列报告之:智能计算芯片
  2. 你敢参与,我就敢送!牛转好运来,新春大抽奖
  3. 高校毕业生:今年“太惨了”,网友:更惨的可能还在后头!
  4. 大白话讲解闭包笔试题
  5. 写 5 个你知道的 HTML5 标签,说明他们的意义
  6. AngularJS第二课(指令,作用域,控制器)
  7. JNI命令行下编译错误解决方案
  8. 5分钟学会Java 9~Java11的七大新特性
  9. Mysql 瓶颈优化
  10. 深入理解PHP原理之Opcodes