Spring事务管理总结

来源:互联网 发布:php一般用什么开发工具 编辑:程序博客网 时间:2024/06/16 07:34
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(){@Overrideprotected 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 : 超时期限 -->*/


原创粉丝点击