springboot--事务的使用
@Transactional原理
事务是一些sql语句对数据库操作的集合,因此如果在一个Java方法里涉及了对数据库的操作,业务需要的话我们就可以考虑把这些操作作为一个事务。通过在方法上加个@Transactional(....)注解即可。
如:
public class Transaction {
@Transactional(....)
public void doSomething() {
.....
}
}
对于springboot,加了@Transactional的方法其实是这样执行的:
BEGIN TRANSACTION;
try{
doSomething(); //执行方法
COMMIT;
}catch(Throwable t){
if(t是该回滚的异常)
ROLLBACK;
else
COMMIT;
}
知道了注解的原理就好办了,接下来只需了解这个注解的参数即可应付很多业务场景。
控制回滚参数
rollbackFor = xx.class 表示抛出的异常是xx类及其子类,事务会回滚; noRollbackFor = yy.class表示抛出异常是yy类或其子类,事务不会回滚。在@Transactional(rollbackFor = xx.class , noRollbackFor = yy.class)中,使用了控制回滚的参数。

catch到异常具体怎么办?根据以上几点规则,判断异常类型与参数中声明的类型关系决定。
事务组合控制参数
当一个作为事务的方法调用另一个作为事务的方法,它们之间的关系如何?这可以通过propagation参数控制。规则如下:

例如:
public class Transaction {
@Autowired
TransactionB b;
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 插入 id=1 的记录
b.methodB();
}
}
class TransactionB {
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// 插入 id=2 的记录
}
}
1.methodB的注解参数 propagation = Propagation.REQUIRED 表示二者合并为同一个事务,id = 1,id = 2的记录只可能同时插入成功,或者同时插入失败。
2.若methodB的注解参数 propagation = Propagation.REQUIRES_NEW 表示methodB的事务会被作为一个新事务,两个事务之间没有约束关系,是独立的。 id = 1,id = 2的记录可能同时插入失败/成功,也可能成功插入某一条。
3.若methodB的注解参数 propagation = Propagation.NESTED,表示methodB的事务是嵌套在methodA的事务中的,嵌套事务成功需要依赖主事务成功。反过来嵌套 事务则不会决定主事务的成功。即id = 1插入成功(主),id = 2(嵌套)不一定插入成功;id = 1插入失败,id = 2则一定插入失败。
事务隔离级别控制参数
事务隔离级别的设置很简单,直接@Transactional(isolation = xx)就可以指定方法中事务的隔离级别,隔离级别从低到高有:READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)、SERIALIZABLE(串行化)。具体隔离级别以及每个隔离级别的意义这里就不讲了。
事务超时控制参数
timeout参数表示事务的时间限制,超出指定时间则抛出TransactionTimeOut异常。使用如下:
@Transactional(timeout = 5) //秒
public void methodA() { ---事务开始则计时开始
// 1 执行java代码 ---纳入计时
// 2 执行sql ---执行前检查是否超时
// 3 执行java代码 ---纳入计时
// 4 执行sql --执行前检查是否超时
// 5 执行java代码 ---由于sql执行完毕,事务已提交,这里不被纳入计时
}
注意:只有每次执行sql前会检查是否超时,如果执行这个sql前没超时,就算这个sql执行了20s也不会抛出TransactionTimeOut异常。
springboot--事务的使用的更多相关文章
- 【原创】003 | 搭上基于SpringBoot事务思想实战专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往基于Spring Boot事务思想实战的专车,在上一篇 搭 ...
- 【原创】004 | 搭上SpringBoot事务诡异事件分析专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 本专车系列文章 目前连载到第四篇,本专题是深入讲解Springboot源码,毕竟是 ...
- SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源
SpringBoot集成Mybatis 第一步我们需要在pom.xml里面引入mybatis相关的jar包 <dependency> <groupId>org.mybatis. ...
- java事务/springboot事务/redis事务
java事务(数据库事务):jdbc事务--ACID springboot事务:@Transactional--ACID redis事务:命令集合 将redis事务与mysql事务对比: Mysq ...
- springboot 事务创建流程源码分析
springboot 事务创建流程源码分析 目录 springboot 事务创建流程源码分析 1. 自动加载配置 2. InfrastructureAdvisorAutoProxyCreator类 3 ...
- springboot事务的传播行为和隔离级别
springboot事务的传播行为和隔离级别 在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的 传播行为定义了7种,分别用0-6来表示 ...
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- 第六章 springboot + 事务(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...
- 第六章 springboot + 事务
在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...
- SpringBoot事务注解@Transactional
SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作. 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理 ...
随机推荐
- Promise异步编程解决方案
Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...
- 【经验分享】ASP.NET 的 Page_Load 执行了2次,真的!
发现问题 这是来自一位网友的提问: 本着求真务实的态度,我打开了 AppBoxPro 项目,本地调试果然发现 Page_Load 进入了两次! 其实在没测试之前,我就有了大概的方向,因为AppBoxP ...
- Oracle DBLink跨数据库访问SQL server数据同步 踩坑实录
项目需求:这里暂且叫A公司吧,A公司有一套人事管理软件,需要与我们公司的软件做人员信息同步,A公司用的是SQL server数据库,我们公司用的Oracle,接口都不会开发(一万句"fuck ...
- Linux基础文件类型
一.文件时间 ls -l 文件名 仅看的是文件的修改时间 [root@linux ~]# ls -l /etc/passwd -rw-r--r-- root root 5月 : /etc/passwd ...
- GridView 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- python_0基础开始_day05
第五节 一.字典 python的数据结构之一 字典 —— dict 定义:dic = {"key":"dajjlad"} 作用:存储数据,大量,将数据和数据起到 ...
- 用html和css写一个头部header和左侧菜单栏menu-bar固定的的页面
这个页面header部分是100%的宽度,60px的高度,左侧是刚好一屏的高度,180的宽度,右侧的部分把剩余的空间占满,刚开始的时候还没怎么接触这样的页面,以为使用js读取浏览的可视化宽高,然后在做 ...
- Extjs4 combobox autoLoad: true 时,加载两次
问题是这样的,combobox 远程加载数据时,当我们把 store 设置为 autoLoad: tue, 时,这样页面加载时,store 会load 一次,但是我们在第一次点击 下来框时,他还会 ...
- webgl核心要素
WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,提供硬件3D加速渲染, ...
- android——SQLite数据库存储(操作)
public class MyDatabaseHelper extends SQLiteOpenHelper { //把定义SQL建表语句成字符串常量 //图书的详细信息 //ID.作者.价格.页数. ...