Spring 声明式事务

一、什么是事务

    1、概念:把一组业务当成一个业务来做,要么都成功,要么都不成功,是保证业务操作完整行的一种数据库机制。
    2、种类:在事务控制方面主要有两个分类。
        1、编程式事务:在代码中直接加入处理事务的逻辑,可能需要在代码中调试一些事务管理的相关方法。
        2、声明式事务:在方法的外部添加注解或者直接在配置文件中定义,将事务管理代码从业务中分离处理,以声明的方式实现食物管理。Spring 的AOP就可以实现该功能:事务管理代码的固定模式作为一种横切关注点,通过AOP方法模块化,进而实现声明式事务。
    3、声明式事务的特性:ACID
        A原子性:一个事务中的所有操作,要么都成功,要么都失败,不会结束在中间的某个环节。事务执行过程中发生错误,会被回滚到食物开始前的状态,就像这个事务没有执行过一样。即:事务不可再分,不可约简。
        C一致性:在事务开始之前和结束之后,数据库的完整性没有被破坏,保证数据的一致性。
        I 隔离性:在并发的情况下,事务之间要相互隔离,防止多个事务兵法之行时由于交叉执行而导致的数据不一致情况,事务的隔离级别有四个,下面会详细介绍。
        D持久性:数据处理结束后,对数据的修改就是永久性的,即便系统故障也不会丢失。

二、怎么实现声明式事务

    1、声明式事务配置介绍
        1)Spring从不同的事务管理API中抽出了一整套食物管理机制,让食物管理代码从特定的食物技术中独立出来。开发人员通过配置的方式进行食物管理,而不必了解底层是如何实现的。
        Spring的核心食物管理抽象是PlatformTransactionManager。它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务(编程式、声明式),事务管理器都是必须的。
        事务管理器可以以普通的bean形式声明在Spring IOC容器中。
    2)Spring提供的事务管理器
    配置文件中配置

<!‐‐事务控制‐‐>
 <!‐‐配置事务管理器的bean‐‐>
 <bean id="transactionManager" class="org.springframework.jdbc.datasourc e.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
 </bean>
 <!‐‐开启基于注解的事务控制模式,依赖tx名称空间‐‐>
 <tx:annotation‐driven transaction‐manager="transactionManager"></tx:annotation‐driven>  

    :使用该标签的时候,一定要注意依赖的是tx名称空间的引用。
    配置好之后,需要配合注解@Transactional注解使用。
    @Transactional可以标记在类上,也可以标记在方法上。标记在类上时代表该类下的所有方法都运用上了事务;当标记在方法上时,则只是当前方法运用事务。当然也可以同时存在与类和方法上,这种情况以方法上的为准,如果方法上没有注解,则以类上的为准。
    虽然@Transactional直接加在类上是更省事的,但是并不建议这么使用,写在方法上面控制的粒度更细,避免不必要的问题出现,影响开发效率。同时,@Transactional一般会存在于业务逻辑层中,在绝大多数情况下,只有业务逻辑层才会出现嵌套调用的情况。
    2、事务配置的属性
        isolation:设置事务的隔离级别
        propagation:事务的传播行为
        noRollbackFor:那些异常事务可以不回滚                
        noRollbackForClassName:填写的参数是全类名
        rollbackFor:哪些异常事务需要回滚
        rollbackForClassName:填写的参数是全类名
        readOnly:设置事务是否为只读事务
        timeout:事务超出指定执行时长后自动终止并回滚,单位是秒。
        1)设置隔离级别
            解决什么问题:在并发(同一时间,多个线程同时进行请求)情况下,对同一个数据进行读写操作时产生的问题。
        会产生的问题:
            a)脏读:表示一个事物能够读取到另一个事物中还未提交的数据。比如:某事物尝试插入记录A,此时该食物还未提交,然后另一个事务就读取到了记录A。
            b)不可重复读:是指在一个事务内,多次读同一个数据,但读取到的结果不一样,会在本市无中产生数据不一致的问题。
            c)幻读:指同一个事物内多次查询返回的结果集不一样。比如同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询就有m条数据了,这就好像产生了幻觉。发生幻读的原因也是另一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
        解决方式(也就是事务隔离级别):
            未提交读(READ-UNCOMMITTED):最低隔离级别,事务未提交之前,就可以被其他食物读取到,可能产生:脏读、幻读、不可重复读。
            已提交读(READ-COMMITTED):一个事务提交后才能被其他事务读取到,会造成幻读、不可重复读,能解决脏读问题。
            可重复读(REPEATABLE-READ):默认隔离级别,保证多次读取同一数据时,其值都和事务开始时候的内容是一致的,禁止读取到别的食物为提交的数据,也会造成幻读,可以解决脏读和不可重复读。
            序列化(SERIALIZABLE):代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
    :不可重复读和幻读诗有些相似的,区别在于前者只需要锁行,后者需要锁表,大家不要弄混了哦。


事务隔离级别

三、为什么要使用事务

    首先,Spring时通过AOP对事务进行管理的,当在数据库执行多步操作时,其中一步出现数据异常时通过事务之行回滚,事务不是必须使用的,这取决于项目是需不需要做事务控制,当然,在大多数企业级项目中,都是需要的哈。他也是维护数据安全性的一种方式,像是在银行的项目中的转账服务,事务就是至关重要的,需要他的护航,避免金钱交易出现错差。

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