Spring事务管理总结

Spring事务管理:
Spring事务管理高层抽象主要包括3个接口
(1)PlatformTransactionMannager事务管理器(提交,回滚等)
(2)TransactionDefinition事务定义信息(隔离,传播,超时,只读)
(3)TransactionStatus 事务具体运行状态


一、PlatformTransactionMannager事务管理器
    spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
    例如:使用spring JDBC或mybatis 进行持久化数据时使用:DataSoourceTransactionManager
                使用Hibernate3.0版本进行持久化数据时使用:HibernateTransactionManager
二、TransactionDefinition事务定义信息
    脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的
    不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。
    幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就产生了
    
    事务隔离级别:
    READ_UNCOMMITED 允许读取还未提交的改变了的数据,可导致脏、幻、不可重复读
    READ_COMMITTED  允许在并发事务已经提交后读取。可防止脏读,但幻读,不可重复读仍可导致
    REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变,可防止脏、不可重复读,但幻读可能发生
    SERIALIZABLE   完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中设计的数据表来完成的。
    
    事物的传播行为:解决业务层之间的互相调用问题(主要介绍三种)
    PROPAGATION_REQUIRED   支持当前事务,如果不存在就新建一个
    PROPAGATION_REQUIRES_NEW 如果有事物存在,挂起当前事务,创建一个新的事务
    PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
    
三、TransactionStatus 事务具体运行状态
    里面定义了一些方法里进行判断当前事务。例如:
    hasSavepoint()是否有保存点
    isCompleted()是否已经完成
    isNewTransaction()是否是一个新的事务
    
Spring支持两种方式的事务管理
1.编程式的事务管理
通过TransactionTemplate手动管理事务(实际中很少用)
<!-- 事务模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 在service层使用事务模板 -->
<bean id="accontServiceImpl" class="cn.edu.sdut.service.impl.AccontServiceImpl">
<property name="accountDao" ref="accountDaoImpl"></property>
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
//业务方法
public void transfer(final String out, final String in, final Double money) {
		transactionTemplate.execute(new TransactionCallbackWithoutResult(){
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				accountDao.inMoney(in, money);
				accountDao.outMoney(out, money);
			}});
		
			
		
	}

2.使用XML配置声明式事务
Spring的声明式事务是通过AOP实现的
     方式一:基于TransactionProxyFactoryBean代理 实现事务
      
 <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 事务管理 -->
<property name="transactionManager" ref="transactionManager"/>
<!-- 代理对象-->
<property name="target" ref="accountServiceImpl2"/>
<!-- 设置事务参数 -->
<property name="transactionAttributes">
<props>
<!--prop 格式:
                        PROPAGATION  : 事物的传播行为
                        ISOLATION    : 事务的隔离级别
                        readOnly   :只读(不可以进行修改的)
                        -Exception  :发生哪些异常回滚事务
                        +Exception :发生哪些异常事务不回滚
  -->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
        方式二:基于AspectJ的XML方式事务管理
        
   <!-- 配置事务通知(事务的增强) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!--
    propagation:事物的传播行为
    isolation:事物的隔离级别
    read-only:只读
    rollback-for:发生哪些异常回滚
    no-rollback-for:发生那些异常不回滚
    timeout : 超时期限
     -->
    <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"  timeout="-1"/>
    </tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<aop:pointcut expression="execution(* cn.edu.sdut.service.impl.AccountServiceImpl3.*(..))" id="pc1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

         方式三:基于AspectJ的注解方式事务管理
        
   <!-- 开启注解方式 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>

@Transactional(propagation=Propagation.REQUIRED)
/*<!--
propagation:事物的传播行为
isolation:事物的隔离级别
read-only:只读
rollback-for:发生哪些异常回滚
no-rollback-for:发生那些异常不回滚
timeout : 超时期限
 -->*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值