[Spring事务]

来源:互联网 发布:diy相册制作软件 编辑:程序博客网 时间:2024/06/06 01:14

1.四个特性:

1.原子性(Atomicity):确保动作要么全部完成,要么完全不起作用

2.一致性(consistency):一旦事务完成,系统必须确保它所建模的业务处于一致的状态,而不会是部分完成,部分失败。

3.隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

4.持久性(Durability):一旦事务完成,无论发生什么系统错误,结果都不应该受到影响。事务的结果被写到持久化存储器中


2.核心接口

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

Spring事务管理器的接口 org.springframework.transaction.PlatformTransactionManager,

---getTransaction

---commit

---rollback

2.1.1 JDBC事务

如果直接用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。通过配置XML适用。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource" />    </bean>
DataSourceTransactionManager是通过调用java.sql.Connection来管理事务,后者是通过DataSource获取到的。通过调用连接的commit()方法

来提交事务,同样,通过调用rollback()方法进行回滚

2.1.2Hibernate事务

用到HibernateTransactionManager

XML配置如下:

 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory" />    </bean>
sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,hibernate的transaction对象是从hibernate session 中获取到的,当事务成功完成时,hibernateTransactionManager将会调用Transaction对象的commit()方法,反之会调用rollback() 方法


2.1.3Java持久化API事务(JPA)

需要适用spring的JpaTransactionManager来处理事务

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

JpaTM 只需哦装配一个JPA实体管理工厂,JpaTM将与由工厂产生的JPA EntityManager合作来构建事务。


2.1.4 Java原生API事务

如果使用多个数据源或者不用上面的,需要用JtaTransactionManager

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">        <property name="transactionManagerName" value="java:/TransactionManager" />    </bean>
JTA TM 将事务管理的责任委托给javax.transaction.userTransaction,和TransactionManager对象,事务完成通过UserTransaction.commit()方法提交,失败通过UserTransaction.rollback()回滚




2.2基本事务属性的定义,PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务,这个方法里面的参数是TransactionDefinition类,这个类就定义了一些基本的事务属性。 

事务属性:传播行为、格力规则、回滚规则、事务超时、是否只读


2.2.1 传播行为

七种传播行为:

propagation_required:当前方法必须运行在事务中,如果当前事务存在,则在事务中运行,不存在启动新事务

propagation_supports:当前方法不需要事务上下文,如果存在当前事务,会在事务中运行

propagation_mandatory:必须在事务运行,如果当前事务不存在会抛出异常

propagation_required_new:当前方法必须运行在它自己的事务中,一个新事务将被启动。如果存在当前事务,在该方法执行期间,当前事务

会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager(需要使用JtaTransactionManager作为事务管理器)

propagation_propagation_not_supported:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

propagation_never 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常

propagation_nested  表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。

在该方法之前需要调用setSavepoint方法,保存当前状态到savepoint,内层事务依赖于外层事务,外层事务失败时,会回滚内层所做动作,内层事务操作失败不会引起外层回滚。



----TransactionManager tm = null; tm = getTransactionManager();tm.begin();  Transaction ts1 = tm.getTransaction();


--- propagation_nested和propagation_requires_new 区别:如果不存在一个活动的事务都会开启新事务,但是 new内外层事务是两个独立事务,不会互相影响。


另一方面, PROPAGATION_NESTED 开始一个 “嵌套的” 事务, 它是已经存在事务的一个真正的子事务. 潜套事务开始执行时, 它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交。


2.2.2隔离级别

1.并发事务引起的问题:

1)脏读 Dirty reads:A事务度去了B事务改写但尚未提交的数据,如果改写回滚,则A事务读取无效数据

2)不可重复读 Nonrepeatable read :发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据,这通常是因为另一个并发事务

在两次查询期间进行了更新。

3)幻读(Phantom read): T1读取几行数据,接着T2插入一些数据,随后查询T1发现原本不存在的记录

不可重复读和幻读差别在与:不可重复读主要是数据修改,幻读在于记录增加或者删除。


2.隔离级别:

isolation_default     使用后端数据库默认的隔离级别

isolation_read_uncommitted     最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

isolation_read_committed     允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

isolation_repeateable_read    对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生

isolation_serializable   最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的



2.2.3 只读

事务的第三个特性是它是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性进行一些特定的优化


2.2.4 事务超时

对数据库的锁定,长时间的事务会不必要的占用数据库资源,事务超时就是事务的一个定时器,如果特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是

等待其结束



2.2.5 回滚规则

可以定义哪些异常会回滚哪些不会。默认 运行期异常才会回滚,检查型异常不会回滚。


2.3事务状态

调用PlatformTransactionManager接口的getTransaction()方法得到的是TransactionStatus接口的一个实现,该接口内容为

public interface TransactionStatus{    boolean isNewTransaction(); // 是否是新的事物    boolean hasSavepoint(); // 是否有恢复点    void setRollbackOnly();  // 设置为只回滚    boolean isRollbackOnly(); // 是否为只回滚    boolean isCompleted; // 是否已完成} 

3.编程式事务:

3.1编程式事务和声明式事务的区别:编程式事务侵入到业务代码,提供更详细的事务管理,声明式事务由于基于AOP,既能起到事务管理的作用,

又可以不影响业务代码的具体实现。

3.2如何实现编程式事务:使用TransactionTemplate和直接使用PlateformTransactionManager


3.2.1 使用TransactionTemplate(线程安全)

TransactionTemplate tt = new TransactionTemplate(); // 新建一个TransactionTemplate    Object result = tt.execute(        new TransactionCallback(){              public Object doTransaction(TransactionStatus status){                  updateOperation();                  return resultOfUpdateOperation();              }      }); // 执行execute方法进行事务管理


3.2.2 使用PlatformTransactionManager


DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); //定义一个某个框架平台的TransactionManager,如JDBC、Hibernate    dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource()); // 设置数据源    DefaultTransactionDefinition transDef = new DefaultTransactionDefinition(); // 定义事务属性    transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED); // 设置传播行为属性    TransactionStatus status = dataSourceTransactionManager.getTransaction(transDef); // 获得事务状态    try {        // 数据库操作        dataSourceTransactionManager.commit(status);// 提交    } catch (Exception e) {        dataSourceTransactionManager.rollback(status);// 回滚    }



4.声明式事务:

4.1配置方式  五种

1)每个bean有一个代理

2)所有bean共享一个代理基类
3)使用拦截器

4)使用tx标签配置的拦截器

5)全注解


 @Transactional(propagation=Propagation.REQUIRES_NEW,            isolation=Isolation.READ_COMMITTED,            noRollbackFor={UserAccountException.class},            readOnly=true, timeout=3)





阅读该文章的笔记

http://www.mamicode.com/info-detail-1248286.html




原创粉丝点击