Spring事务管理

Spring事务管理

这篇主要是介绍spring的事务管理部分,主要是基于XML方式的声明式事务和基于Annotation的声明式事务

开发环境

在目前阶段,所使用的开发环境主要如下
IDEA2018.2.5
Spring-5.1.4

使用前配置

所需要的jar文件
所需要的jar文件

在这里直接采用上一篇博客中写好的类及其方法

链接如下
Account类及其方法和属性

基于XML方式的声明式事务

xml文件如下


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- 1.配置数据源 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--数据库驱动 -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <!--连接数据库的url -->
        <property name="url" value="jdbc:mysql://localhost/spring" />
        <!--连接数据库的用户名 -->
        <property name="username" value="root" />
        <!--连接数据库的密码 -->
        <property name="password" value="root" />
    </bean>
    <!-- 2.配置JDBC模板 -->
    <bean id="jdbcTemplate"
          class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 默认必须使用数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--3.定义id为accountDao的Bean -->
    <bean id="accountDao" class="com.jdbc.AccountDaoImpl">
        <!-- 将jdbcTemplate注入到AccountDao实例中 -->
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <!-- 4.事务管理器,依赖于数据源 -->
    <bean id="transactionManager" class=
            "org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 5.编写通知:对事务进行增强(通知),需要编写对切入点和具体执行事务细节 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- name:*表示任意方法名称 -->
            <tx:method name="*" propagation="REQUIRED"
                       isolation="DEFAULT" read-only="false" />
        </tx:attributes>
    </tx:advice>
    <!-- 6.编写aop,让spring自动对目标生成代理,需要使用AspectJ的表达式 -->
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.jdbc.*.*(..))"
                      id="txPointCut" />
        <!-- 切面:将切入点与通知整合 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
    </aop:config>
</beans>
在AccountDao接口中创建transfer()方法
public void transfer(String outUser,String inUser,Double money);
在AccountDaoImpl中实现transfer()方法
public void transfer(String outUser,String inUser,Double money){
        this.jdbcTemplate.update("update account set balance = balance +?"+"where username = ?",money,inUser);
        int i=1/0;  //用来模拟系统运行时突发性的问题,
//  如果没有事务控制,在转账操作执行后,收款用户余额会增加
 //  而汇款用户的余额因为系统问题保持不变
 //  增加事务控制后,在转账操作执行后,收款和汇款用户的余额在出现问题前后都保持不变
        this.jdbcTemplate.update("update account set balance = balance -?"+"where username = ?",money,outUser);
    }
编写测试类方法
public void xmlTest(){
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountDao accountDao=(AccountDao) applicationContext.getBean("accountDao");
        accountDao.transfer("jack","Rose",100.0);
        System.out.println("转账成功");
 }
运行如下

在这里插入图片描述

基于Annotation方式的声明式事务

xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
    <!-- 1.配置数据源 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--数据库驱动 -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <!--连接数据库的url -->
        <property name="url" value="jdbc:mysql://localhost/spring" />
        <!--连接数据库的用户名 -->
        <property name="username" value="root" />
        <!--连接数据库的密码 -->
        <property name="password" value="root" />
    </bean>
    <!-- 2.配置JDBC模板 -->
    <bean id="jdbcTemplate"
          class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 默认必须使用数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!--3.定义id为accountDao的Bean -->
    <bean id="accountDao" class="com.jdbc.AccountDaoImpl">
        <!-- 将jdbcTemplate注入到AccountDao实例中 -->
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <!-- 4.事务管理器,依赖于数据源 -->
    <bean id="transactionManager" class=
            "org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 5.编写通知:对事务进行增强(通知),需要编写对切入点和具体执行事务细节 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
修改AccountDaoImpl中实现transfer()方法

在这个过程中,只需添加事务注解便可,代码如下

 @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,readOnly = false)
    public void transfer(String outUser,String inUser,Double money){
        this.jdbcTemplate.update("update account set balance = balance +?"+"where username = ?",money,inUser);
     //   int i=1/0;
        this.jdbcTemplate.update("update account set balance = balance -?"+"where username = ?",money,outUser);
    }
运行,提示转账成功

写在最后

通过对比这两种事务处理方式,发现基于Annotation方式的事务注解只需要做两件事,其一在Spring容器中注册事务注解驱动

<tx:annotation-driven transaction-manager="transactionManager"/>

其二在需要使用事务的Bean类方法前添加注解@Transactional

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值