zoukankan      html  css  js  c++  java
  • Spring 事物管理

    Spring在企业开发中,能和其他框架进行整合,Spring的职责在于Bean管理和事物操作

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

       事务使用ACID特性来衡量事务的质量。介绍如下: 
        1,原子性 
            事务必须是原子的,在事务结束的时候,事务中的所有任务必须全部成功完成,否则全部失败,事务回滚到事务开始之间的状态。 
        2,一致性 
            事务必须保证和数据库的一致性,即数据库中的所有数据和现实保持一致。如果事务失败数据必须返回到事务执行之前的状态,反之修改数据和现实的同步。 
        3,隔离性 
            隔离性是事务与事务之间的屏障,每个事务必须与其他事务的执行结果隔离开,直到该事务执行完毕,它保证了事务的访问的任何数据不会受其他事务执行结果的影响。 
        4,持久性 
            如果事务成功执行,无论系统发生任何情况,事务的持久性都必须保证事务的执行结果是永久的。 

    xml配置的编写

    <!-- 配置事务管理器(声明式的事务) -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--事务的控制-->
    <bean id="stockServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager"></property>
    <property name="target" ref="stockService"></property>
    <!--事物属性-->
    <property name="transactionAttributes">
    <props>
    <prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
    </props>
    </property>

    </bean>

     事物之间的缺陷

    1.脏读取

      当一个事务读取了另一个事务尚未提交的更新,就叫脏读取。在另一个事务回滚的情况下,当前事务所读取的另一个事务的数据就是无效的。

    2.不可重复读取

      在一个事务中执行多次同样的查询操作,但每次查询的结果都不一样,就叫做不可重复读取,通常这种情况是由于数据在二次查询之间被另一个并发的事务所修改。

    3.幻象行

      这是对事务危害最小的一个问候,它类似不可重复读取,也是一个事务的更新结果影响到另一个事务问题。但是它不仅影响另一个事务查询结果,而且还会使查询语句返回一些不同的行录行。 
        这3个问题危害程度依次为:脏读取最大-->不可重复读取-->幻影行最小。

    Spring事务类型详解

    <property name="transactionAttributes">
    <props>
    <prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StockException</prop>
    </props>
    </property>

    Spring中常用事务类型:

    PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

    PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

    PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

    PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

    PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

     2,事务的隔离级别 

        为解决事务之间的3个缺陷,必须在事务之间建立隔离关系来保证事务的完整性。 
        ISOLATION_DEFAULT         
            使用数据库默认的隔离级别 

       ISOLATION_COMMITTED     
            允许读取其他并发事务已经提交的更新(防此脏读) 
        ISOLATION_READ_UNCOMMITTED 
            允许读取其他并发事务还未提交的更新,会导致事务之                间的3个缺陷发生,这是速度最快的一个隔离级别,但同                时它的隔离级别也是最低 
        ISOLATION_REPEATABLE_READ 
            除非事务自身修改了数据,否则规定事务多次重复读取        数据必须相同(防此脏读,不可重复读) 
        ISOLATION_SERIALIZABLE 
            这是最高的隔离级别,它可以防此脏读,不可重复读和        幻读等问题,但因其侵占式的数据记录完全锁定,导致 

  • 相关阅读:
    用Axure进行原型设计
    Axure使用——创建折叠菜单
    详解Java的自动装箱与拆箱(Autoboxing and unboxing)
    Java基本类型和引用类型
    Java中的基本类型和引用类型变量的区别
    让图片变成圆形
    安卓----Spinner
    Win10安装CAD2006
    Winform关于未找到元数据文件.exe和不包含适合于入口点的静态“Main”方法
    启用了优化或没有调试信息
  • 原文地址:https://www.cnblogs.com/xuhaifeng017/p/7712206.html
Copyright © 2011-2022 走看看