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配置.  若某一个类需要特殊的处理,贴标签.
      

       到此事务管理完成!

  • 相关阅读:
    (转)【web前端培训之前后端的配合(中)】继续昨日的故事
    ural(Timus) 1136. Parliament
    scau Josephus Problem
    ACMICPC Live Archive 6204 Poker End Games
    uva 10391 Compound Words
    ACMICPC Live Archive 3222 Joke with Turtles
    uva 10132 File Fragmentation
    uva 270 Lining Up
    【转】各种字符串哈希函数比较
    uva 10905 Children's Game
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8257692.html
Copyright © 2011-2022 走看看