标签:
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);
}
});
标签:
原文地址:http://www.cnblogs.com/zhao307/p/5339283.html