spring事务管理(推荐注解方式)

手动管理spring-jdbc事务

  1. 首先导入spring-jdbc的jar包
  2. 在service层依赖注入事务管理模板transactionTemplate
  3. 然后在spring配置文件中注入事务管理模板,
    其中事务管理模板中需要注入属性事务管理器transactionManager,这个事务管理器实现了PlatformTransactionManager平台事务管理器接口;事务管理器需要注入属性datasource
  4. 最后用事务管理模板包裹一组逻辑操作即可完成事务管理
service层代码
package com.zzti.service.impl;

import com.zzti.dao.AccountDao;
import com.zzti.service.AccountService;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

/**
 * @Classname AccountServiceImpl
 * @Description service层
 * @Author jdq8576
 * @Date 2019/2/18 21:59
 * @Version 1.0
 **/
public class AccountServiceImpl implements AccountService {
    private AccountDao accountDao;
    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    @Override
    public void transfer(String outer, String inner, Integer money) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                accountDao.in(inner,money);
                int i=1/0;
                accountDao.out(outer,money);
            }
        });
    }
}
applicationContext.xml
<bean id="accountService" class="com.zzti.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
        <property name="transactionTemplate" ref="transactionTemplate"></property>
    </bean>

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

    <!--配置事务模板-->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="dataSourceTransactionManager"></property>
    </bean>  

面向代理工厂的spring事务管理

这种方式主要基于配置文件的事务管理,粘出applicationContext.xml,具体注释在配置文件里面

applicationContext.xml
<bean id="accountService" class="com.zzti.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
    </bean>


    <!--配置工厂代理-->
    <bean id="proxyAccountService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!--接口-->
        <property name="proxyInterfaces" value="com.zzti.service.AccountService"></property>
        <!--目标对象-->
        <property name="target" ref="accountService"></property>
        <!--事务管理器-->
        <property name="transactionManager" ref="transactionManager"></property>
        <!--事务的一些属性配置 需要一个properties类型的值-->
        <!--
            prop.key:确定哪些方法使用当前事务配置
            prop.text:用于配置事务详情
            格式: PROPAGATION ISOLATION readOnly,-Exception +EXception
                    传播行为    隔离级别  只读       异常回滚    异常提交

            在这个五个中,后三个是可选的;但是可选只能选择一个.
            +Exception:Exception是可以具体到哪种异常的
        -->
        <property name="transactionAttributes">
            <props>
                <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,+java.lang.ArithmeticException</prop>
            </props>
        </property>

    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
AccountServiceImpl实现类的代码
public void transfer(String outer, String inner, Integer money) {
        accountDao.in(inner,money);
        accountDao.out(outer,money);
    }
测试类的代码
@Test
    public void test(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountService accountService = (AccountService) applicationContext.getBean("proxyAccountService");
        accountService.transfer("jdq","yx",100);
    }

使用spring的aop标签来管理事务

  • 配置切入点
  • 配置增强,在配置增强的时候,需要在spring的配置文件中注入事务管理器,但是在增强类中spring会帮我们自动注入这个属性。
  • 这样配置的service层直接getBean(accountService)就行了,即可完成事务管理。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>


    <!--配置通知 事务管理器-->
    <tx:advice id="transactionInterceptor">
        <tx:attributes>
            <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!--使用spring的aop标签来配置-->
    <aop:config>

        <!--切入点 experssion后面跟的的方法表达式-->
        <aop:pointcut id="myPointCut"
                      expression="execution(* com.zzti.service.impl.AccountServiceImpl.transfer(..))"></aop:pointcut>

        <!--事务与连接点相关联-->
        <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="myPointCut"></aop:advisor>
    </aop:config>

注解方式

  • 在applicationContext.xml直接注入事务管理器和事务管理器和开启事务管理
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
</bean>
      <!--开始事务注解驱动-->
<tx:annotation-driven></tx:annotation-driven>
  • 在具体类的方法或者类上直接加上注解@Transactional(readOnly = true),括弧里面是事务的传播行为,隔离级别等属性.
  • 注解方式太好用了

需要的一下jar包

链接:我是链接
提取码:vv4k

猜你喜欢

转载自blog.csdn.net/jdq8576/article/details/87652903