Spring: 事务

概述

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSourceTransactionManager代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、 TransactionManager这两部分只是会根据数据访问方式有所变化。

DataSource

DataSource主要有 DataSource(JDBC/Mybatis)、SessionFactory(Hibernate) 和 EntityManager(JPA)。

TransactionManager

根据底层所使用的不同的持久化 API 或框架,PlatformTransactionManager 的主要实现类大致如下:

  • DataSourceTransactionManager:适用于使用JDBC和Mybatis进行数据持久化操作的情况。
  • HibernateTransactionManager:适用于使用Hibernate进行数据持久化操作的情况。
  • JpaTransactionManager:适用于使用JPA进行数据持久化操作的情况。
    另外还有JtaTransactionManager 、JdoTransactionManager、JmsTransactionManager等等。

代理机制

  1. Bean和代理
    通过配置 TransactionProxyFactoryBean 生成代理。
  2. 使用拦截器
    通过配置 TransanctionInterceptorBeanNameAutoProxyCreator生成代理。
  3. 使用tx标签配置的拦截器
    通过配置标签<tx:advice/><aop:config/>实现。
  4. 全注解配置
    通过配置<tx:annotation-driven transaction-manager=".."/>和注解@Transactional实现。

事务的隔离级别

事务的4种隔离级别,参见 数据库事务

Spring事务传播行为

Spring中提供了7种事务传播行为,是对4种隔离级别的补充。

  1. PROPAGATION_REQUIRED
    如果当前有事务,支持当前事务;
    如果当前没有事务,新建一个事务。
    这是最常见的选择。
  2. PROPAGATION_REQUIRED_NEW
    如果当前有事务,挂起当前事务;
    如果当前没有事务,新建一个事务。
  3. PROPAGATION_NESTED
    如果当前有事务,在当前事务中嵌套其他事务;
    如果当前没有事务,就新建一个事务。

    嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

  4. PROPAGATION_SUPPORTS
    如果当前有事务,支持当前事务;
    如果当前没有事务,就以非事务方式执行

  5. PROPAGATION_NOT_SUPPORTED
    如果当前有事务,挂起当前事务;
    如果当前没有事务,就以非事务方式执行
  6. PROPAGATION_NEVER
    如果当前有事务,抛出异常
    如果当前没有事务,就以非事务方式执行
  7. PROPAGATION_MANDATORY
    如果当前有事务,支持当前事务;
    如果当前没有事务,抛出异常

感谢:
http://blog.csdn.net/hjm4702192/article/details/17277669
https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/
http://www.cnblogs.com/zhangzongle/p/5978301.html