zoukankan      html  css  js  c++  java
  • 大型运输行业实战_day11_2_事务理论与实际生产配置事务管理

    1.什么是事务(Transaction:tx)

         数据库的某些需要分步完成,看做是一个整体(独立的工作单元),不能分割,要么整体成功,要么整体生效。“一荣俱荣,一损俱损”,最能体现事务的思想。
    案例:银行转账案例,A给B转账1000元钱,会涉及到减少A账户余额的1000元,增加B账户的余额1000元。该过程,必须要成功,都成功,要失败,都失败。
    该特性体现在SQL中,就是一个操作中的多条SQL语句,要么都执行成功,要么都失败。
    事务必须体现四个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy),简称ACID。
    1.原子性:表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作成功,整个事务才提交,若事务中任何一个操作失败,已经执行的所有操作都必须撤销,让数据恢复到最初的状态。
    2.一致性:整个事务操作成功之后,数据库所处的状态和业务的规则是一致的,即数据不会被破坏。比如A转账给B的案例中,无论成功与否,A和B的总金额是不会改变的。
    3.隔离性:在并发数据库操作时,不同的事务拥有各自的数据空间,他们的操作要做到彼此之间相互不产生干扰,而数据库的不同隔离级别对应着不同的干扰程度,隔离级别越高,数据的一致性越高,但是并发性越弱。
    4.持久性:一旦事务提交成功之后,事务中所有的数据操作都必须被持久化到数据库中,及时提交事务之后,数据库马上回滚,在数据库重启时,页必须保证能通过某种机制恢复数据。

    2.数据库并发问题

           数据库可以拥有多个客户端,若多个客户端并发地访问数据库中相同的资源,如果没有采取必要的隔离措施,则会导致各种并发问题,破坏数据的完整性。
    这些问题归结为5类,包括3类数据读问题(脏读,不可重复读,幻读)和2类数据更新问题(第一类丢失更新,第二类丢失更新)。

          2.1.脏读

          

       2.2.不可重复读

         

      2.3. 幻读

        

         一般使用表锁机制可以,防止新增数据.

      2.4. 第一类丢失更新

        

      2.5 第二类丢失更新

       

    3.事务的隔离级别

            尽管数据库提供了锁机制的DML操作方式,但是直接使用锁还是非常麻烦的,为此数据库提供了自动锁机制。
    只要用户指定事务的隔离级别,数据库就会分析事务的SQL语句,自动的为数据资源添加适合的锁,并会负责锁的维护,可提高性能。
    SQL92标准中定义了4个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,
    根据不同的隔离级别,可以导致不同的结果,当然不同的事务隔离级别能解决数据并发问题的能力是不同的。 如图:

      

    4.Spring对事务的支持

      4.1. Spring的事务管理主要包括3个接口

          1.TransactionDefinition   :封装事务的隔离级别,超时时间,是否为只读事务和事务的隔离级别和传播规则等事务属性,可通过XML配置具体信息。
          2.PlatformTransactionManager:根据TransactionDefinition提供的事务属性配置信息,创建事务。
         2.TransactionStatus:封装了事务的具体运行状态。比如,是否是新开启事务,是否已经提交事务,设置当前事务为rollback-only等。
      两种方式:
      Spring支持编程式事务管理和声明式事务管理:
      1.编程式事务管理:事务和业务代码耦合度太高。
      2.声明式事务管理:侵入性小,把事务从业务代码中抽离出来,提供维护性。

    4.2.Spring的事务管理

      1.PlatformTransactionManager:接口统一抽象处理事务操作相关的方法;
          1):TransactionStatus getTransaction(TransactionDefinition definition):
                     根据事务定义信息从事务环境中返回一个已存在的事务,或者创建一个新的事务,并用TransactionStatus描述该事务的状态。
           2):void commit(TransactionStatus status):
                   根据事务的状态提交事务,如果事务状态已经标识为rollback-only,该方法执行回滚事务的操作。
              3):void rollback(TransactionStatus status):
                  将事务回滚,当commit方法抛出异常时,rollback会被隐式调用
      2.在使用spring管理事务的时候,首先得告诉spring使用哪一个事务管理器; 看图
      3.常用的事务管理器:
             DataSourceTransactionManager:使用JDBC,MyBatis的事务管理器;
            HibernateTransactionManager:使用Hibernate的事务管理器;

    4.3.事务传播规则

       Spring在TransactionDefinition接口中定义了七种事务传播规则,规定了事务方法和事务方法发生嵌套调用时事务该如何进行传播,如下图:

       

    4.4.实际案例配置

         4.4.1 声明式事务管理-基于xml配置

              配置说明

             

            参数详解:

           

          

           注意:更多详细配置参看官方文档约 364页!

          

        完整的生产配置:

      

        生产上使用的事务管理详细使用,可以参看之前的博客: 大型运输行业实战_day11_1_aop理论与aop实际业务操作

    4.4.2.声明式事务管理-基于注解配置(一般不使用注解)

         步骤如下:

       

      

         使用:

         

       生产应用场景:

        每个service组件上都要贴标签. 开发中: 通常的使用 xml配置.  若某一个类需要特殊的处理,贴标签.
      

       到此事务管理完成!

  • 相关阅读:
    微信小程序 简单控件
    #负分小组WEEK1#一个开头&小组介绍
    CountDownLatch使用场景及分析
    Markdown基础语法
    【转】awk的使用及字符串的操作
    【开篇有益】敢问路在何方,佛曰路就在脚下
    【EntityFramework 6.1.3】个人理解与问题记录(2)
    EETOOL简介
    VMware 安装失败 “Failed to create the requested registry key Key:installer Error:1021"
    vs2010调试时为什么会出现clr.dll与mscordacwks.dll版本不匹配?
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8257692.html
Copyright © 2011-2022 走看看