Spring事务

        今天我们去看一下spring是怎么管理事务的。我们先去了解一下事务的特性和spring事务的属性。spring并不是直接去管理事务,而是为JDBC、Hibernate等平台提供了一个模板接口来实现他们各自的事务管理器,我们去看一下:

事务管理器

        先去看看事务的特性,这些东西都老生常谈了(ACID),这里再提一下吧:

        原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

        一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

        隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

        持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

        我们再来看看spring事务都有什么属性:

        下边我们分别看一下属性具体是指什么,首先是事务的传播特性

spring事务的属性

        传播特性

        传播特性主要有七种,看一下:

        1、PROPAGATION_REQUIRED:当前方法必须运行在事务中,如果事务存在,则运行在这个事务中,事务不存在就重新开启一个事务。(支持事务)

        2、PROPAGATION_SUPPORTS:表示事务不是必须的,如果存在事务,则在事务中运行;如果不存在事务,就以非事务的方式运行。(支持事务)

        3、PROPAGATION_MANDATORY:表示方法必须在事务中运行,否则抛异常。(支持事务)

        4、PROPAGATION_REQUIRES_NEW:表示了事务的独立性。就是每个方法都拥有自己的事务,如果有事务存在,则将原事务挂起,重新开启一个新的事务。

        5、PROPAGATION_NOT_SUPPORTED:表示方法不在事务中运行,如果有事务存在,则挂起事务执行方法。(不支持事务)

        6、PROPAGATION_NEVER:不能存在事务。如果有事务存在,就抛异常。(不支持事务)

        7、PROPAGATION_NESTED:表示嵌套事务。如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。嵌套是子事务套在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务,这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。那么问题来了,如果子事务回滚,父事务会回滚到之前建立的回滚点(save point);父事务回滚,子事务也会跟着回滚。(讲道理这个地方真的像极了生活中的父子关系,儿子犯错了,父亲也有责任;父亲犯错了,儿子也会收到影响)

        隔离级别

        隔离级别主要有三种,分别是:脏读、幻读、不可重复读。先看看这三种隔离级别都是表示什么

        脏读:一个事务读到另一个事务未提交的更新数据,所谓脏读,就是指事务A读到了事务B还没有提交的数据。

        幻读:幻读主要是发生在新增和删除的情景中。比如第一个事务执行修改操作,这个时候第二个事务进行新增或删除操作,导致第一个事务的结果有数据未修改或者缺少数据,这种现象被称作是幻读。

        不可重复读:事务读取了两次数据,在这两次的读取过程中另一个事务修改了数据,导致第一个事务的这两次读取出来的数据不一样。这种现象被称作是不可重复读。

        我们再看一下spring事务的隔离级别,它这里支持五种,我们分别看一下:

        1、ISOLATION_DEFAULT:这里就是选择数据库本身的隔离级别。Mysql的默认隔离级别是可重复读(ISOLATION_REPEATABLE_READ),Oracle的默认隔离级别是读已提交(ISOLATION_READ_COMMITTED)。

        2、ISOLATION_READ_UNCOMMITTED:读未提交。就是脏读。

        3、ISOLATION_READ_COMMITTED:读已提交。可以避免脏读。

        4、ISOLATION_REPEATABLE_READ:可重复读。避免了可重复读,但是还会有幻读的风险。

        5、ISOLATION_SERIALIZABLE:可串行化。最高级别的隔离级别,成功避免了脏读、幻读和不可重复读。就好像是串联电路一样,只能够逐一挨个执行,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务。

        超时

        所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。 默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。

        只读

        事务的只读属性是指,对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、 JMS 资源,以及自定义的事务性资源等等。如果确定只对事务性资源进行只读操作,那么我们可以将事务标志为只读的,以提高事务处理的性能。在 TransactionDefinition 中以 boolean 类型来表示该事务是否只读。

        提到了spring事务,就难免涉及到Transactional这个注解,先看看注解都有什么重要的属性:

@Transactional

        看一下是怎么用的,然后讲讲都是什么意思:

@Transactional使用

        说一下这些属性:

        value:这个属性是指定事务管理器的,没人把它会放注解上,这个基本上不用。

        propagation:这里指的是spring事务的传播特性,对应上边的七种,默认是REQUIRED。

        isolation:隔离级别,对应上边的五种隔离级别,默认值是DEFAULT。

        timeout:用于设置事务的超时秒数,默认值为-1表示永不超时。

        readOnly:该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。从这这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!(查询中不会出现别人在我们事务提交之后提交的数据)。

        rollbackFor:该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

        rollbackForClassName:该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。

        noRollbackFor:该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。

        noRollbackForClassName:该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。

        在使用的时候要注意:

        1、要配置<tx:annotation-driven transaction-manager="transactionManager" />来开启事务的注解,不配置是没有效果的。

        2、只有uncheck exception才会使事务回滚,checked exception不会使用回滚。如果要在checked exception中让事务回滚,在属性rollbackFor中增加unchecked exception。

        3、readOnly能不用就不用。

        4、注解只有在public声明的类上才会生效。

        没有了没有了!

        

        



                

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Spring 事务属性分析 事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的...
    壹点零阅读 1,279评论 0 2
  • 转载自:https://www.jianshu.com/p/8ddc01f23540 Spring事务机制主要包括...
    星海辰光大人阅读 344评论 0 0
  • 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用。spring事务开启 ,或者是基于接口的或者是基于类的...
    jackcooper阅读 1,399评论 0 10
  • 事物的特性(ACID) 我们在使用JDBC或者Mybatis进行数据持久化操作时,我们的xml配置通常如下: 并发...
    Y了个J阅读 1,189评论 0 1
  • 活动进程达到一半了,身体的重量没有减下去太多周末争取多活动一下,发现自行车运动可以有效达到消耗脂肪的作用加油 补上...
    没困落夫斯基阅读 165评论 0 1