Spring事务回滚,异常抛出

 

事务回滚是指在发生异常或错误时,将数据库操作撤销到事务开始之前的状态。事务回滚的作用是保证数据的一致性和完整性。

当一个事务执行过程中出现异常或错误时,事务回滚会将之前已经执行的数据库操作全部撤销,恢复到事务开始之前的状态。这样可以避免因为错误操作导致数据的不一致性或不完整性。

事务回滚的主要作用有:

  1. 数据一致性:当执行一系列数据库操作时,如果其中某个操作失败或出现异常,事务回滚可以将所有操作都撤销,确保数据的一致性。例如,当向数据库插入数据时,如果插入过程中出现错误,事务回滚可以撤销插入操作,使得数据库中的数据仍然保持一致。

  2. 操作原子性:事务回滚可以确保操作的原子性,即要么全部执行成功,要么全部撤销。这样可以避免因为部分操作失败而导致数据的不完整或损坏。例如,在进行资金转账操作时,如果转账过程中出现错误,事务回滚可以撤销所有转账操作,确保转账的原子性。

  3. 错误恢复:当出现错误或异常时,事务回滚可以将数据库恢复到之前的状态,使得操作可以重新执行或者进行修复。通过事务回滚,可以快速回退到可用状态,避免错误导致的影响持续扩散。

总之,事务回滚是一种保障数据一致性和操作原子性的机制,可以在发生错误或异常时将数据库操作撤销,恢复到事务开始之前的状态。这样可以确保数据库的数据保持一致性,并提供了错误恢复的能力。

当一个事务发生异常并进行回滚时,会将整个事务中的数据库操作都撤销到事务开始之前的状态。这意味着,无论是第一次事务还是第二次事务,只要它们在同一个事务中执行,都会受到回滚的影响。

在你的代码中,第二次事务发生在第一次事务之后,并且两者都在modify方法中被调用。由于modify方法使用了@Transactional注解,表示它是一个事务方法,而且两次事务的传播行为都是Propagation.REQUIRED,意味着它们会在同一个事务中执行。CopyCopyCopyCopyCopy

当第一次事务发生异常并回滚时,会将整个事务中的数据库操作都撤销,包括第二次事务。这就是为什么你的第二次事务也被中断的原因。

如果你希望保持第二次事务的正常运行,可以考虑将第一次和第二次事务分开,或者使用不同的事务传播行为来控制它们之间的关系。例如,可以将第一次事务设置为Propagation.REQUIRED,将第二次事务设置为Propagation.REQUIRES_NEW,这样它们就会在独立的事务中执行,相互之间不会相互干扰。

 applicationContext文件如下

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="com.igeek.day4"/>
    <context:property-placeholder location="classpath:druid.properties"/>
    <aop:aspectj-autoproxy/>


<!--    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--        <property name="username" value="root"/>-->
<!--        <property name="password" value="root"/>-->
<!--        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>-->
<!--        <property name="url" value="jdbc:mysql://localhost:3306/shop"/>-->
        <property name="username" value="${druid.username}"/>
        <property name="password" value="${druid.password}"/>
        <property name="driverClassName" value="${druid.driver}"/>
        <property name="url" value="${druid.url}"/>
<!--        <property name="maxActive" -->
    </bean>
    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="dataSource"/>
    </bean>
<!--    配置事务管理器-->
    <bean name="transManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    配置事务的注解扫描-->
    <tx:annotation-driven transaction-manager="transManger"/>
<!--配置声明式事务 xml版本-->
<!--    <tx:advice id="myTx" transaction-manager="transManger">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="modify*" propagation="REQUIRED" isolation="READ_COMMITTED"/>-->
<!--            <tx:method name="insert*" propagation="REQUIRED" isolation="READ_COMMITTED"/>-->
<!--            <tx:method name="update*" propagation="REQUIRED" isolation="READ_COMMITTED" rollback-for="Exception"/>-->
<!--        </tx:attributes>-->
<!--    </tx:advice>-->
<!--    &lt;!&ndash;    aop配合事务&ndash;&gt;-->
<!--    <aop:config>-->
<!--&lt;!&ndash;    配置切入点&ndash;&gt;-->
<!--        <aop:pointcut id="mypc" expression="execution(* com.igeek.day4..*.*(..))"/>-->
<!--&lt;!&ndash;    aop:advisor单次配置   &ndash;&gt;-->
<!--        <aop:advisor advice-ref="myTx" pointcut-ref="mypc"/>-->
<!--    </aop:config>-->

<!--    <bean name="user" class="com.igeek.day3.entity.User"/>-->
</beans>

异常抛出 

 事务回滚

 

根据您提供的配置文件,涉及到的知识点如下:

  1. 数据源配置:您使用了com.alibaba.druid.pool.DruidDataSource作为数据源,并配置了相关的属性,如用户名、密码、驱动类和URL等。DruidDataSource是由阿里巴巴开发的一个开源数据库连接池,相比于传统的连接池,它具有更强的监控和统计功能,能够提供更好的性能和可靠性。

  2. JdbcTemplate配置:您定义了一个名为jdbcTemplateJdbcTemplatebean,并设置了其构造函数参数为数据源。JdbcTemplate是Spring提供的一个简化数据库访问的工具类,它封装了JDBC操作的细节,提供了一系列的方法来执行SQL语句和处理结果。

  3. 事务管理器配置:您定义了名为transMangerDataSourceTransactionManagerbean,并设置了其数据源为之前定义的数据源。DataSourceTransactionManager是Spring提供的一个事务管理器实现,它负责管理数据库事务的开启、提交和回滚等操作。

  4. 注解驱动事务配置:您使用了<tx:annotation-driven>标签开启了注解驱动的事务管理,并将事务管理器设置为之前定义的事务管理器。该配置可以自动将@Transactional注解标记的方法纳入事务管理,省去了手动编写事务管理的繁琐配置。

  5. 异常处理配置:在之前被注解@Transactional修饰的方法上,您使用了rollback-for属性来指定需要回滚的异常类型为Exception。这意味着当这些方法抛出Exception及其子类异常时,事务会进行回滚。您可以根据实际需求来设置需要回滚的异常类型。

  6. AOP配置(注释部分):在配置文件中,您使用了注释部分的<tx:advice><aop:config>标签来配置事务的传播行为、隔离级别以及切入点等。通过这些配置,您可以更细粒度地控制事务的行为,例如指定特定的方法需要开启事务、设置事务的隔离级别、指定事务的传播行为等。

除了以上涉及到的知识点,还可以对配置文件进行进一步的拓展和优化。例如,您可以配置事务的超时时间、设置事务的读写模式、定义事务的前置和后置处理逻辑等。另外,您还可以使用基于注解的声明式事务配置来简化事务管理的配置。通过进一步学习和了解Spring事务管理的知识,您可以更好地优化和调整您的配置,以提升系统的可靠性和性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值