Spring事务管理

1:

  Spring事务管理高层抽象主要包括了3个接口:PlatformTransactionManager(事务管理器) 、 TransactionDefinition(事务定义信息 隔离 传播 超时 只读)、TransactionStatus(事务具体运行状态)

  Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现:HibernateTransactionManager使用Hibernate进行持久化数据时使用,DataSourceTransactionManager使用Spring JDBC或iBatis进行持久化数据时使用。

  事务的四大特性:原子性、一致性、隔离性、持久性 ACID.

  在不考虑隔离性会引发安全问题:脏读、不可重复读、幻读。

    事务隔离级别:read_unconmited read_conmited repeatable_read serializable

    脏读:一个事务读取了另一个事务改写但未提交的数据,一旦回滚,读到的数据是无效的。

    不可重复读:在同一个事务中,多次读取同一个数据返回的结果不同。

    幻读:是对插入记录而言,读取了几行之后,发现了别的事务插入的数据。

  事务的传播行为:结局业务层方法之间相互调用的问题。

    propagation_required 支持当前事务,如果不存在,就新建一个(两个事务在一起)

    propagation_required_new 如果有事务存在,挂起当前事务,创建一个新事务(两个事务不在一起)

    propatation_nested 如果当前事务存在,则嵌套事务执行

2.

  Spring事务一定在配置文件中创建事务的bean,只有这样才能引入事务。JDBC用的是DataSouceTransactionManager,Hibernate用的是HibernateTransactionManager 前者通过dataSource指定事务,后者通过SessionFactory指定事务。

  Spring将事务分成了两类:编程式事务管理 声明式事务管理 。但这些都是对事务功能的增强,总体需指明事务的propagation isolation以及对哪些方法添加事务功能

  声明式事务管理:

  1)注解

  在配置文件中

<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

  直接在业务层类上加@Transactional() 在括号中指定隔离级别 传播行为等

@Transactional
public class AccountBizImpl implements AccountBiz

  2)AspectJ

  一定要先导入jar包,目前用的是aopalliance-1.0.jar、aopalliance-1.0-sources.jar、aspectjrt.jsr、aspectjtools.jar、aspectjewaver.jar、org.aspectj.matcher.jar。

  在配置文件中

<!-- 配置事务的通知:(事务的增强) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
Propagation :事务的传播行为
Isolation :事务的隔离级别
read-only :只读
timeout :过期信息
rollback-for :哪些异常回滚
no-rollback-for :哪些异常不回滚
-->

<tx:method name="transfer" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

<!-- 配置切面(aspect是多个切入点,多个通知;advisor是一个切入点,一个通知 -->
<aop:config>
<aop:pointcut expression="execution(* com.zhao.biz.AccountBiz+.*(..))" id="pointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>

  3)TransactionProxyFactoryBean

  创建代理类,在这里指明事务  事务管理器 以及在哪个类中应用这些设置

<!-- 配置业务层的代理 -->
<bean id="accountBizProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置目标对象 -->
<property name="target" ref="accountBiz"></property>
<!-- 注入事务管理器 -->
<property name="transactionManager" ref="transactionManager"></property>
<!-- 注入事务属性 -->
<property name="transactionAttributes">
<props>
<!-- prop格式 :
*PROPAGATION :事务的传播行为
*ISOLATION :事务的隔离级别
*readOnly :只读(不可用进行修改,插入,删除)
*-Exception :发生哪些异常回滚事务
*+Exception :发生过哪些异常事务部回滚
-->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

  编程式事务管理:

  自定义transactionTemplate 在方法主体中调用它的exexute方法。

  在配置文件中

<!-- 配置事务管理模板(Spring为了简化事务管理的代码而提供的类 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>

  在业务逻辑类中

/*
* 注入事务管理的模板 private TransactionTemplate template; public
* voidsetTemplate(TransactionTemplate template) { this.template = template;
* }
*/

@Override
public void transfer(String out, String in, Double money) {
// TODO Auto-generated method stub

// 编程式的事务管理(在匿名内部类中使用了out,in变量,所以要给其加上final关键字

 template.execute(new TransactionCallbackWithoutResult() {

 @Override protected void
 doInTransactionWithoutResult(TransactionStatus status) {

// TODO * Auto-generated method stub

  accountDAO.outMoney(out, money);  

  int i=1/0;

   accountDAO.inMoney(in, money);

   }

});

 

  

 

posted @ 2016-03-30 22:42  假寐的我  阅读(191)  评论(0编辑  收藏  举报