Spring事务管理

原创 2016年08月28日 21:08:23

事务是数据库中的概念,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的基本过程:
配置增强方式—->找到切入点——>在切入点定义切面

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)