Spring事务管理(一)

来源:互联网 发布:淘宝试用卖家不发货 编辑:程序博客网 时间:2024/06/05 03:03

事务的理解
存在于一个事务中的方法,要么全部执行成功提交COMMIT,要么其中一个发生异常失败,事务中所有已经执行的方法都将回滚ROLLBACK。
术语ACID:原子性(Atomic)、一致性(Cosistent)、隔离性(Isolate)、持久性(Durable)。

Spring事务管理器
Spring提供了多种事务管理器,可以支持多种使用场景。现只列举两个比较常用的事务管理器:JDBC事务、Hibernate事务。

事务管理器

使用场景

org.springframework.

jdbc.datasource.DataSourceTransactionManager

用于Spring对JDBC抽象的支持;

也可用于mybatis进行持久化

org.springframework.

orm.hibernate4.HibernateTransactionManager

用于Hibernate4进行持久化(可以支持Hibernate多种版本)

……

……

声明式事务
Spring对声明式事务的支持是通过Spring AOP框架实现的。
声明式事务主要的两大实现方式: Spring的tx命名空间 和 @Transactional注解。
 
1.Spring的tx命名空间

    <!-- 配置声明式事务管理 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource" />    </bean>        <!-- 定义AOP通知 -->    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">        <tx:attributes>    <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="remove*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>            <tx:method name="get*" read-only="true" />            <tx:method name="find*" read-only="true" />            <tx:method name="load*" read-only="true" />            <tx:method name="query*" read-only="true" />            <tx:method name="datagrid*" read-only="true" />                        <tx:method name="*" propagation="REQUIRED" />        </tx:attributes>    </tx:advice>    <aop:config>        <!--只对action层实施事务控制-->            <aop:pointcut id="transactionPointcut" expression="(execution(* com.duts..*.action..*ActionImpl.*(..)))" />        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />    </aop:config>
解析:propagation:定义事务的传播规则;回滚规则rollback-for:指定事务对于哪些异常需要回滚而不提交(no-rollback-for:指定事务对于哪些异常不需要回滚继续运行)。具体的参数说明请参考API文档。

2.注解驱动的事务
<tx:annotation-driven />
只需要一行XMl配置即可。Spring会检查上下文中所有的Bean并查找使用@Transactional注解的bean,不管这个注解是用在类级别上还是方法级别上。对于每个使用@Transactional注解的Bean,<tx:annotation-driven />会自动为其添加事务通知。
注解在Action中的使用:

@Transactionalpublic class TestActionImpl implements ITestAtion {@Transactionalpublic void saveData(){......}}

在class类上使用事务注解,表示该类中的所有public方法都支持事务。在method方法上使用事务注解,标识该方法是一个事务方法。

0 0
原创粉丝点击