首先来说下事务,说到事务就不得不说它的四个特性(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以及事务的详细介绍的更多相关文章

  1. Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?

    Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的一般 ...

  2. Spring中的@Transactional

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: @Transactiona ...

  3. Spring中的@Transactional必须要了解的概念

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: 1 @Transactio ...

  4. C++中引用与指针的区别(详细介绍)

    C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别   指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...

  5. spring中的@Transactional注解

    前几天灿哥问我,在做程序的时候,有没有考虑到事务,如果一个函数在中间执行过程中报错了,它会回滚么?我查了一查,spring确实有这样一个注解,能快速帮助我们配置事务管理.下面我就简单介绍一下这个注解. ...

  6. Spring中的@Transactional(rollbackFor = Exception.class)属性详解

    序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法: 异常 如下图所示,我们都 ...

  7. Spring中实现多数据源事务管理

    文章转自  https://www.2cto.com/kf/201507/424229.html 前言 由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避 ...

  8. Spring注解之@Transactional对于事务异常的处理

    spring对于事务异常的处理 unchecked   运行期Exception   spring默认会进行事务回滚       比如:RuntimeException checked       用 ...

  9. [转]使用spring中的@Transactional注解时,可能需要注意的地方

    前情提要 在编写业务层方法时,会遇到很多需要事务提交的操作,spring框架为我们提供很方便的做法,就是在需要事务提交的方法上添加@Transactional注解,比起我们自己开启事务.提交以及控制回 ...

随机推荐

  1. sql查询用nolock

    大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发 ...

  2. HTML、DOM和JS的了解

    1.HTML.JS.以及DOM的关系的关系说明 关于HTML.JS.以及DOM的关系一直很迷惑,虽然一直听人说,但并未理解. 偶然间,忽然懂了这三者之间的关系. 举例吧: HTML就是最终的页面,是一 ...

  3. 转!!Java虚拟机堆的内存分配和回收

    Java内存分配和回收,主要就是指java堆的内存分配和回收.java堆一般分为2个大的区域,一块是新生代,一块是老年代.在新生代中又划分了3块区域,一块eden区域,两块surviver区域.一般称 ...

  4. Redis2.8配置文件详解(转)

    add by zhj : 没找到本文的原文.另外,redis配置文件中文翻译 也翻译的不错,可以与本文对照看.两篇文章都是以Redis2.8来介绍的 在Redis中直接启动redis-server服务 ...

  5. 010-shiro与spring web项目整合【四】缓存Ehcache

    一.Ehcache shiro每次授权都会通过realm获取权限信息,为了提高访问速度需要添加缓存,第一次从realm中读取权限数据,之后不再读取,这里Shiro和Ehcache整合. 1.添加Ehc ...

  6. pc端用微信扫一扫实现微信第三方登陆

    官方文档链接 第一步:获取AppID  AppSecret (微信开发平台申请PC端微信登陆)   第二步:生成扫描二维码,获取code https://open.weixin.qq.com/conn ...

  7. python中self cls init的理解

    原创文章,未经允许禁止转载! python中self cls init的理解 python中self cls init的理解

  8. 浅析造成 JS 内存泄露的几种原因及解决方案

    内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使 ...

  9. Django-MTV(Day66)

    阅读目录 Django基本命令 视图层路由配置系统 视图层之视图函数 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模板):负 ...

  10. Linux基础——硬盘分区、格式化及文件系统的管理

    1. 硬件设备与文件名的对应关系 掌握在Linux系统中,每个设备都被当初一个文件来对待. 设备 设备在Linux内的文件名 IDE硬盘 /dev/hd[a-d] SCSI硬盘 /dev/sd[a-p ...