zoukankan      html  css  js  c++  java
  • Spring 事务控制

    初步理解  

      看了几篇关于事务控制的博客,都不约而同的介绍了事务的基本特性

        原子性:事务是一个原子操作,由一系列动作组成,事务的原子性确保事务要么全部完成,要么不起作用。

        一致性:一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成,部分失败。现实中的数据不应该被破坏。

        隔离性:可能由许多事务同时处理相同的数据,因此每个事务都应该与其它事务隔离。防止数据破坏。

        持久性:一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来,通常情况下,事务的结果被写到持久化存储器中。

    核心接口

    事务管理器

      Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务的职责委托给hibernate或JTA等持久化机制所提供的相关平台框架的事务来实现。

      Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。此接口的内容如下:

    1 Public interface PlatformTransactionManager()...{  
    2     // 由TransactionDefinition得到TransactionStatus对象
    3     TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 
    4     // 提交
    5     Void commit(TransactionStatus status) throws TransactionException;  
    6     // 回滚
    7     Void rollback(TransactionStatus status) throws TransactionException;  
    8 }

    a.JDBC事务

      如果应用程序中直接使用JDBC来进行持久化,会为你处理事务边界,为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:

       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>

      实际上,它是通过java.sql.Connection来管理事务的,而后者是通过DataSource获取的,通过连接的commit()方法来提交事务,同样,事务失败通过rollback()方法来回滚。

    b.Hibernate事务

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    sessionFactory属性需要装配一个Hibernate的Session工厂,HibernateTranscationManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的,当事务完成时,HibernateTransactionManager将会调用Transaction的commit()方法,反之调用rollback()方法。

    c.JAVA持久化API事务(JPA)

      Hibernate多年来一直是事实上的Java持久化标准,但是现在Java持久化API作为真正的Java持久化标准进入大家的视野。如果你计划使用JPA的话,那你需要使用Spring的JpaTransactionManager来处理事务。你需要在Spring中这样配置JpaTransactionManager:

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>

    JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。

    d.JAVA原生API事务

      如果你没有使用到以上所述的事务管理,或是跨越了多个事务管理,你就需要使用  JtaTransactionManager

     <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
            <property name="transactionManagerName" value="java:/TransactionManager" />
        </bean>

    JtaTransactionManager将事务管理的责任委托给javax.transaction.UserTransaction和javax.transaction.TransactionManager对象,其中事务成功完成通过UserTransaction.commit()方法提交,事务失败通过UserTransaction.rollback()方法回滚。

    事务控制失败

      事务控制失败的原因可能是 A -> B ->A 导致容器不知如何控制事务,从而使事务控制失败,注意:B service中的其他方法调用A也算。

      解决办法:

        1.找到循环调用的地方,重写。

        2.将所有的引用改成SpringContextHolder.getBean(ICaCurrentAccountService.class)这种方式调用。

    岁月本长而忙者自促;天地本宽而卑者自隘;风花雪月本闲,而劳忧者自冗;天行健,君子以自强不息;地势坤,君子以厚德载物;宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒.不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安
  • 相关阅读:
    The Single Responsibility Principle
    MSComDlg.CommonDialogserver不能创建对象错误的解决
    Hadoop的HA机制(Zookeeper集群+Hadoop集群)配置记录
    linux怎样查看port被谁占用
    hadoop配置说明
    C#中的继承与多态还有接口
    MySQL DATE_FORMAT() 函数
    MySQL处理数据库和表的常用命令
    mysql 增加用户
    sql2008连接数据库问题
  • 原文地址:https://www.cnblogs.com/vvning/p/7595114.html
Copyright © 2011-2022 走看看