Spring中的@Transactional以及事务的详细介绍
首先来说下事务,说到事务就不得不说它的四个特性(acid):
一、特性
1.原子性(atomicity):一个事务当作为一个不可分割的最小工作单元,一组操作要么全部成功,要么全部失败。
2.一致性(consistency):必须使数据的一个一致性状态变成另一个一致性状态。举个例子,A和B共有1000元,一人500,他们之间发生了资金上的往来,不管最后各自有多少钱,但是他们的总和还是1000元。
3.隔离性(isolation):在并发的时候,一个事务不能影响到另一事务,相互之间没有任何关系的。
4.持久性(durability):指在事务提交了之后,对数据库中的数据的修改永久的保存下来。
二、事务的隔离级别
1.读未提交(read_uncommited):发生脏读现象-->指一个事务中读取到另一个事务中未提交的数据。解决这种现象,需要将数据库的隔离级别设置为read_commited
2.读已提交(read_commited):会发生不可重复读的现象-->指一个事务中,前后两次查询的数据不一样,在后一次查询到另一个事务对数据进行了更新数据操作并提交了的数据。解决这种情况需要将数据库的隔离级别设置为repeatbale_read。oracle数据库默认的就是这个隔离级别(read_commited)。
3.可重复读(repeatable-read):会发生虚读(幻读)现象-->指在一个事中,前后两次查询的数据不一样,在后一次的查询到另一个事务对数据库做了新增数据并提交了的数据。解决这种情况需要将数据库的隔离级别设置为serializable,mysql数据库的默认级别就是这个(repeatable_read)。
4.序列化(serializable):serializable是事务的最高隔离级别,事务一个个的执行,比较消耗数据库的性能,几乎不用。
注意:不可重复读针对的是update操作,虚读(幻读)针对的是insert操作。这一点容易让人迷惑。
下面来简要的说下Spring中的事务,spring中的事务主要使用的声明式事务,什么不懂什么是声明式事务,事务分为编码式事务,和声明式事务,编码式事务就是你要自己手动的编写事务,获取jdbc的连接啊,设置事务自动提交为false啊,手动commit啊,出现了错误rollback啊。声明式事务就是Spring中的事务处理,使用aop啊,或者注解啊,注解的底层使用的也是aop。
来主要说说@Transactional 中的几个属性代表了啥
propagation 事务的传播机制,下面解释下propagation的几个取值代表什么意思,(默认的取required)
required :没有就创建一个transaction,有的话就不创建
required_new :重新创建一个属于自己的事务,原来有的事务将被挂起
mandatory: 该方法只能存在一个已存在的事务中,自己不能发起事务,如果不存在事务,会抛出异常
supports: 如果存在事务就在此事务下执行,如果没有,就在无事务下执行
not_supported:声明不需要事务,如果关联到一个事务,会将这个事务挂起,调用结束过,原事务接着执行
never:该方法绝不能在事务里面执行,如果关联到事务就报错,该方法只能在无事务里面执行
nested:如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务
isolation:事务的隔离级别,它的值就是上面我已经介绍过的几个(read_uncommited,read_commited,repeatable_read,serializable),默认是取数据库的隔离级别,就是你使用哪种数据库,它的隔离级别就是哪个,好比你用的oracle,就是read_commited,或者你用的是mysql,就是repeatable_read.
rollback-for:默认的当程序抛出unchecked的例外(runtimeException以及它的子类),会发生数据的回滚,可以自定义需要哪种异常的情况下回滚数据
read_only :表示只读,不能对数据进行cud.
timeout:表示事务的超时时间:默认的取数据库设置的事务超时时间,如果没有就是无限长,没有时间限制。
no_rellback_for:和rollback_for相反。
注意:@Transactional 作用在方法上的时候,只能作用在Public修饰的方法上。作用在其他的访问控制符上的方法,事务不会生效,也不会报错。
参考: https://www.cnblogs.com/yepei/p/4716112.html
Spring中的@Transactional以及事务的详细介绍的更多相关文章
- Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的一般 ...
- Spring中的@Transactional
spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: @Transactiona ...
- Spring中的@Transactional必须要了解的概念
spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: 1 @Transactio ...
- C++中引用与指针的区别(详细介绍)
C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...
- spring中的@Transactional注解
前几天灿哥问我,在做程序的时候,有没有考虑到事务,如果一个函数在中间执行过程中报错了,它会回滚么?我查了一查,spring确实有这样一个注解,能快速帮助我们配置事务管理.下面我就简单介绍一下这个注解. ...
- Spring中的@Transactional(rollbackFor = Exception.class)属性详解
序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...
- Spring中实现多数据源事务管理
文章转自 https://www.2cto.com/kf/201507/424229.html 前言 由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避 ...
- Spring注解之@Transactional对于事务异常的处理
spring对于事务异常的处理 unchecked 运行期Exception spring默认会进行事务回滚 比如:RuntimeException checked 用 ...
- [转]使用spring中的@Transactional注解时,可能需要注意的地方
前情提要 在编写业务层方法时,会遇到很多需要事务提交的操作,spring框架为我们提供很方便的做法,就是在需要事务提交的方法上添加@Transactional注解,比起我们自己开启事务.提交以及控制回 ...
随机推荐
- Java Base64解析
最近在业务场景中,需要对第三方传递进来的字符进行base64解密,根据第三方文档提供的解析工具,对数据进行了解析,关于Base64的解析方式如下: String sign = "xxxxxx ...
- java关于Timer schedule执行定时任务 !!!!!!!!!
1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...
- 浅述python中range()函数的用法
函数用法说明: 用法一:range(m) 输出: [0,1,...,m-1](从0到m-1的一个list,不包括m) 示例: 用法二:range(m,n),m<n 输出:[m,m+1,..,n- ...
- cxGrid 使用指南 1
1:cxgrid是应该数据关联的控件,类似dbgrid.2:一般用来查阅表信息,如果要修改的话,直接在上面编辑或添加 非常不方便通常要放几个EDit来对选中的记录进行编辑或添加记录. 因为表一般都有主 ...
- android sliding menu
https://github.com/jfeinstein10/SlidingMenu/
- Redis的LRU机制(转)
原文:Redis的LRU机制 在Redis中,如果设置的maxmemory,那就要配置key的回收机制参数maxmemory-policy,默认volatile-lru,参阅Redis作者的原博客:a ...
- PostgreSQL: WITH Queries (Common Table Expressions)
WITH 允许在 SELECT 语句中定义"表"的表达式,这个"表"的表达式称之为"公共表表达式(Common Table Expression)&q ...
- Android View学习Tips
1.Canvas.save()和Canvas.restore() canvas.save();和canvas.restore();是两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的.这里 ...
- beego——事务处理和命令模式
1.事务处理 ORM 可以简单的进行事务操作. o := NewOrm() err := o.Begin() // 事务处理过程 ... ... // 此过程中的所有使用 o Ormer 对象的查询都 ...
- 请求库之selenium
一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...