Spring事务管理

来源:互联网 发布:outdoor products 淘宝 编辑:程序博客网 时间:2024/06/10 14:42

事务是数据库中的概念,spring支持两种方式的事务管理:
编程式,声明式。


1. 事务中的API介绍

主要是3个接口,

  1. PlatformTransactionManager事务管理器
    Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现,就是提供该接口来实际的管理数据库。
  2. TransactionDefinition事务定义信息(隔离级别,传播,超时时间,只读)
  3. TransactionStatus事务具体运行状态(是否提交等)

具体内容可以参考Spring手册。

总的来说就是:PlatformTransactionManager根据PlatformTransactionManager中的定义来管理事务,管理状态保存到TransactionStatus中。


2. 编程式实现

spring提供了一个事务管理的模板,只需要将事务管理器引入到该模板即可:在xml文件中

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

在service层的类中:

@Override    public void transfer(final String out, final String in, final int money) {        transactionTemplate.execute(new TransactionCallbackWithoutResult() {            @Override            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {                accountDao.out(out, money);                int i = 1/0;                accountDao.in(in, money);            }        });    }

3. 声明式实现

声明式的事务管理,又分为3种

  • 基于TransactionProxyFactoryBean的方式,该方法有个缺点:一次声明只能对一个目标进行增强,不利于维护,因此不常用。
<!-- 配置事务管理器 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!-- 配置业务层的代理 -->    <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">        <!-- 配置目标对象 -->        <property name="target" ref="accountService"></property>        <!-- 注入事务管理器 -->        <property name="transactionManager" ref="transactionManager"></property>        <!-- 注入事务的属性 -->        <property name="transactionAttributes" >            <!-- 用props注入Properties类型对象 -->            <props>                <!--                     prop的格式                        * PROPAGATION   : 事务的传播行为                        * ISOLATION     : 事务的隔离级别                        * readOnly      : 只读(不能进行修改,删除)                        * -Exception    : 发生哪些异常事务回滚                        * +Exception    : 发生哪些异常事务不回滚                 -->                <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop>            </props>        </property>    </bean>
  • 基于AspectJ的xml方式:AspectJ是一个AOP开发框架,用AspectJ的优点是在业务类上不需要添加任何其他注解
<!-- 配置事务管理器 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!-- 配置事务的通知:(事务的增强) -->    <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"/>        </tx:attributes>    </tx:advice>    <!-- 配置AOP的切面 -->    <aop:config>        <!-- 配置切入点  -->        <aop:pointcut expression="execution(* demo3.AccountService+.*(..))" id="pointcut1"/>        <!-- 配置切面 -->        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>    </aop:config>
  • 基于注解的方式,在xml文件配置开启注解事务即可,配置简单,但需要在哦业务层类上添加@Transactional注解
<!-- 配置事务管理器 -->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!-- 开启注解事务 -->    <tx:annotation-driven transaction-manager="transactionManager"/>

在业务层类上:

@Transactional(propagation=Propagation.REQUIRED)public class AccountServiceImpl implements AccountService{

总结一下AOP的基本过程:
配置增强方式—->找到切入点——>在切入点定义切面

0 0
原创粉丝点击