Spring 事务

3 篇文章 0 订阅
本文介绍了Spring的事务管理,包括编程式和声明式实现。重点讲述了声明式事务管理,通过XML配置和注解的方式,展示了如何配置事务管理器、事务增强器以及在出现异常时的数据回滚机制,确保业务逻辑的正确执行。
摘要由CSDN通过智能技术生成

欢迎访问:我的个人网站

Spring 事务管理

事务可以理解为与数据库相关的一组操作,要么全部执行,要么全部不执行。

Spring提供两种事务管理模式:

  • 编程式的实现。
  • 声明式的实现,其中又包含注解实现以及配置文件实现。

Spring事务管理的几个高层接口有以下几个:PlatformTransactionManager事务管理器,事务定义信息TransactionDefinition事务定义信息,TransactionStatus事务状态。针对接口PlatformTransactionManager,有不同的实现类,这些实现类可以根据不同的持久层框架进行选择使用:

  • DataSourceTransactionManage: 使用JDBCTemplate / iBatis / Mybatis 进行持久化工作。
  • HibernateTransactionManage: 使用Hibernate5.0+的版本使用这个实现类进行事务处理。
  • JpaTransactionManage: 使用JPA进行持久化时候使用。
  • JdoTransactionManage: 使用Jdo进行持久化时候使用。
  • JtaTransactionManage: 使用一个JTA实现来管理事务,在一个事务跨越了多个资源的时候,必须使用。

事件模拟

模拟一个事件以演示事务的使用,整体流程如下:service处理转账逻辑,调用DAO进行数据持久化服务。service在执行的过程中主动引发一个异常,转账逻辑将不完整,发生错误。

1.DAO层建立一个转账类并在配置文件进行配置,内部包含一个转账方法:

@Repository  
public class Dao {  
    private JdbcTemplate jdbcTemplate;  
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate){  
        this.jdbcTemplate = jdbcTemplate;  
  }  
    public void fun(String name, Integer salay){  
        jdbcTemplate.update("update t1 set salary = ? where name = ?", salay, name);  
  }  
}

2.创建Service类, 在配置文件进行配置,进行操作,调用DAO中的方法进行处理:

public class Service {
    private Dao dao;
    public void setDao(Dao dao){
        this.dao = dao;
    }

    public void service(){
        dao.fun("KK",100);
        
        int a = 1/0;
        
        dao.fun("MM", 150);
    }
}

3.在配置文件中针对以上内容进行处理:

  <!--组件扫描-->
      <context:component-scan base-package="com"></context:component-scan>

      <!--配置数据源-->
      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="root"/>
            <property name="password" value="111"/>
            <property name="jdbcUrl" value="jdbc:mysql:///test"/>
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
      </bean>

      <!--配置JdbcTemplate对象-->
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
      </bean>

      <!--配置DAO注入JdbcTemplate-->
      <bean id="dao" class="com.bestbigkk.Dao">
            <property name="jdbcTemplate" ref="jdbcTemplate"/>
      </bean>

      <!--配置Service并注入DAO-->
      <bean id="service" class="com.bestbigkk.Service">
            <property name="dao" ref="dao"/>
      </bean>

调用Service方法进行处理之后,由于自动的引发了异常,所以在设置了KK的 余额之后,MM的余额无法被正常修改,造成业务逻辑的错误。所以要使用事务处理,在一项操作未正确完成的时候,可以进行回滚操作。

声明式的事务管理(Xml)

  • 创建事务管理器。
  • 根据事务管理器创建事务增强器。
  • 将创建的事务增强器应用到创建的切入点上面。

1.创建事务管理器。根据具体使用的DAO对象或者框架进行选择,这里使用的是JdbcTemplate,所以使用DataSourceTransactionManager对象, 实际情况下,根据需要进行选择创建。

<bean id="DataSourceTransactionManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource"></property>
</bean>

2.配置事务增强器:

  • transaction-manager: 指定使用哪个事务管理器。
  • id: 该事务增强器的名称。
  • name: 指定要增强哪些方法,支持正则表达式。
<tx:advice transaction-manager="DataSourceTransactionManage" id="transactionInterceptor">
    <tx:attributes>
          <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

3.配置切面,将配置的事务增强器应用到所建立的切入点上:

  • 1.配置切入点
  • 2.配置应用到切入点的事务增强器
<aop:config>
    <aop:pointcut id="point" expression="execution(* com.bestbigkk.Service.*(..))"/>
    <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="point"/>
</aop:config>

完整Xml配置文件:

	  <!--配置数据源-->
      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="root"/>
            <property name="password" value="111"/>
            <property name="jdbcUrl" value="jdbc:mysql:///test"/>
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
      </bean>

      <!--配置JdbcTemplate对象-->
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
      </bean>

      <!--配置DAO注入JdbcTemplate-->
      <bean id="dao" class="com.bestbigkk.Dao">
            <property name="jdbcTemplate" ref="jdbcTemplate"/>
      </bean>

      <!--配置Service并注入DAO-->
      <bean id="service" class="com.bestbigkk.Service">
            <property name="dao" ref="dao"/>
      </bean>

      <!--配置事务管理器,这里使用的是JdbcTemplate,所以使用DataSourceTransactionManager对象, 实际情况下,根据需要进行选择创建。-->
      <bean id="DataSourceTransactionManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
      </bean>
      
      <tx:advice transaction-manager="DataSourceTransactionManage" id="transactionInterceptor">
            <tx:attributes>
                  <tx:method name="*"/>
            </tx:attributes>
      </tx:advice>

      <aop:config>
            <aop:pointcut id="point" expression="execution(* com.bestbigkk.Service.*(..))"/>
            <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="point"/>
      </aop:config>

此时再运行上述代码,在出现异常之后,数据会自动回滚到之前的状态以保证业务逻辑的正常处理。

声明式的事务管理(注解)

该方法相较于Xml配置而言很简单,大体分为三个步骤:

  • 配置事务管理器。
  • 配置注解。
  • 使用注解。

1.配置事务管理器,根据需要进行选择,并注入数据源:

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

2.配置注解,选择要使用的事务管理器:

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

3.使用注解,在要进行事务控制的方法所属类上使用 @Transactional 注解即可:

@Transactional
public class Service {
	//...
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值