事务回滚是指在发生异常或错误时,将数据库操作撤销到事务开始之前的状态。事务回滚的作用是保证数据的一致性和完整性。
当一个事务执行过程中出现异常或错误时,事务回滚会将之前已经执行的数据库操作全部撤销,恢复到事务开始之前的状态。这样可以避免因为错误操作导致数据的不一致性或不完整性。
事务回滚的主要作用有:
-
数据一致性:当执行一系列数据库操作时,如果其中某个操作失败或出现异常,事务回滚可以将所有操作都撤销,确保数据的一致性。例如,当向数据库插入数据时,如果插入过程中出现错误,事务回滚可以撤销插入操作,使得数据库中的数据仍然保持一致。
-
操作原子性:事务回滚可以确保操作的原子性,即要么全部执行成功,要么全部撤销。这样可以避免因为部分操作失败而导致数据的不完整或损坏。例如,在进行资金转账操作时,如果转账过程中出现错误,事务回滚可以撤销所有转账操作,确保转账的原子性。
-
错误恢复:当出现错误或异常时,事务回滚可以将数据库恢复到之前的状态,使得操作可以重新执行或者进行修复。通过事务回滚,可以快速回退到可用状态,避免错误导致的影响持续扩散。
总之,事务回滚是一种保障数据一致性和操作原子性的机制,可以在发生错误或异常时将数据库操作撤销,恢复到事务开始之前的状态。这样可以确保数据库的数据保持一致性,并提供了错误恢复的能力。
当一个事务发生异常并进行回滚时,会将整个事务中的数据库操作都撤销到事务开始之前的状态。这意味着,无论是第一次事务还是第二次事务,只要它们在同一个事务中执行,都会受到回滚的影响。
在你的代码中,第二次事务发生在第一次事务之后,并且两者都在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>-->
<!-- <!– aop配合事务–>-->
<!-- <aop:config>-->
<!--<!– 配置切入点–>-->
<!-- <aop:pointcut id="mypc" expression="execution(* com.igeek.day4..*.*(..))"/>-->
<!--<!– aop:advisor单次配置 –>-->
<!-- <aop:advisor advice-ref="myTx" pointcut-ref="mypc"/>-->
<!-- </aop:config>-->
<!-- <bean name="user" class="com.igeek.day3.entity.User"/>-->
</beans>
异常抛出
事务回滚
根据您提供的配置文件,涉及到的知识点如下:
-
数据源配置:您使用了
com.alibaba.druid.pool.DruidDataSource
作为数据源,并配置了相关的属性,如用户名、密码、驱动类和URL等。DruidDataSource
是由阿里巴巴开发的一个开源数据库连接池,相比于传统的连接池,它具有更强的监控和统计功能,能够提供更好的性能和可靠性。 -
JdbcTemplate配置:您定义了一个名为
jdbcTemplate
的JdbcTemplate
bean,并设置了其构造函数参数为数据源。JdbcTemplate
是Spring提供的一个简化数据库访问的工具类,它封装了JDBC操作的细节,提供了一系列的方法来执行SQL语句和处理结果。 -
事务管理器配置:您定义了名为
transManger
的DataSourceTransactionManager
bean,并设置了其数据源为之前定义的数据源。DataSourceTransactionManager
是Spring提供的一个事务管理器实现,它负责管理数据库事务的开启、提交和回滚等操作。 -
注解驱动事务配置:您使用了
<tx:annotation-driven>
标签开启了注解驱动的事务管理,并将事务管理器设置为之前定义的事务管理器。该配置可以自动将@Transactional
注解标记的方法纳入事务管理,省去了手动编写事务管理的繁琐配置。 -
异常处理配置:在之前被注解
@Transactional
修饰的方法上,您使用了rollback-for
属性来指定需要回滚的异常类型为Exception
。这意味着当这些方法抛出Exception
及其子类异常时,事务会进行回滚。您可以根据实际需求来设置需要回滚的异常类型。 -
AOP配置(注释部分):在配置文件中,您使用了注释部分的
<tx:advice>
和<aop:config>
标签来配置事务的传播行为、隔离级别以及切入点等。通过这些配置,您可以更细粒度地控制事务的行为,例如指定特定的方法需要开启事务、设置事务的隔离级别、指定事务的传播行为等。
除了以上涉及到的知识点,还可以对配置文件进行进一步的拓展和优化。例如,您可以配置事务的超时时间、设置事务的读写模式、定义事务的前置和后置处理逻辑等。另外,您还可以使用基于注解的声明式事务配置来简化事务管理的配置。通过进一步学习和了解Spring事务管理的知识,您可以更好地优化和调整您的配置,以提升系统的可靠性和性能。