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注解,比起我们自己开启事务.提交以及控制回 ...
随机推荐
- Android去掉标题的方法
我们写程序的时候经常要全屏显示或者不显示标题.比如我们做地图导航的时候就不要标题了,下面介绍三种方法来实现Android去掉标题. 第一种:也一般入门的时候经常使用的一种方法 在setContentV ...
- SqlBulkCopy 通过泛型数组批量插入
public void SqlBulkCopy<T>(string tablename, List<T> list) { Type recordType = typeof(T) ...
- [Intellij idea]解决debug时中文显示方框问题
1. 点击File -> Settings 进入Intellij的设置页面 2. 点击Appearance,选择Override defaults fonts by (not recommend ...
- C# 计算每周和每月固定日期
最近发现写程序不是简单的实现功能,过程中偶尔伴随者一点小小的算法,比如排序算法,比如周期性的数据等等,发现算法不仅仅需要考虑全面,而且要计算简便.性能优良,而我远远没有达到要求! 一:周.月固定日期 ...
- 存一些可能会用得到的vue的UI框架
VUX 项目主页:https://vux.li/#/ github地址:https://github.com/airyland/vux element UI(饿了么后台) Element 是由饿了么U ...
- Openstack块存储cinder安装配置
openstack service create --name cinderv2 \ --description "OpenStack Block Storage" volumev ...
- JDK源码分析之concurrent包(二) -- 线程池ThreadPoolExecutor
上一篇我们简单描述了Executor框架的结构,本篇正式开始并发包中部分源码的解读. 我们知道,目前主流的商用虚拟机在线程的实现上可能会有所差别.但不管如何实现,在开启和关闭线程时一定会耗费很多CPU ...
- 数值和字符串相互转换(C++ 数据类型转换技巧)
类型转换是将一种类型的值映射为另一种类型的值.进行数据类型的转换. 是在实际代码编写中经常遇到的问题,特别是字符串和其他类型的转换. 1.将字符串转换为整数 (1).转换函数// 双精度函数doubl ...
- PHP 神奇的sprintf函数
sprintf 1.定义 sprintf() 函数将字符串进行各种类型的格式化. 2.语法 sprintf(format,arg1,arg2,arg++) format:格式类型. arg1,arg2 ...
- XPath 快速入门
XPath 是一门在 xml 文档中查找信息的语言. XPath 使用路径表达式来选取 xml 文档中的节点或者节点集合. 路径表达式由元素和属性组成. 语法介绍 // 示例: // xml 文档 & ...