目录
事务管理
一个数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行。事务管理是一个重要组成部分,RDBMS 面向企业应用程序,以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性说成是 ACID:
原子性:事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
一致性:这表示数据库的引用完整性的一致性,表中唯一的主键等。
隔离性:可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
- 持久性:一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
事务的传播机制
Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用 。
编程式事务管理 :这意味着你在编程的帮助下有管理事务。这给了你极大的灵活性,但却很难维护。
- 声明式事务管理 :这意味着你从业务代码中分离事务管理。你仅仅使用注释或 XML 配置来管理事务。
spring的传播类型 | 描述 |
TransactionDefinition.PROPAGATION_MANDATORY | 支持当前事务;如果不存在当前事务,则抛出一个异常 |
TransactionDefinition.PROPAGATION_NESTED |
如果存在当前事务,则在一个嵌套的事务中执行 |
TransactionDefinition.PROPAGATION_NEVER |
不支持当前事务;如果存在当前事务,则抛出一个异常 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED |
不支持当前事务;而总是执行非事务性 |
TransactionDefinition.PROPAGATION_REQUIRED |
支持当前事务;如果不存在事务,则创建一个新的事务 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW |
创建一个新事务,如果存在一个事务,则把当前事务挂起 |
TransactionDefinition.PROPAGATION_SUPPORTS |
支持当前事务;如果不存在,则执行非事务性 |
TransactionDefinition.TIMEOUT_DEFAULT |
使用默认超时的底层事务系统,或者如果不支持超时则没有。 |
Spring 事务抽象
Spring 事务抽象的关键是由 org.springframework.transaction.PlatformTransactionManager 接口定义
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
getTransaction(TransactionDefinition definition)
根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务。
void commit(TransactionStatus status)
该方法提交给定的事务和关于它的状态。
void rollback(TransactionStatus status)
该方法执行一个给定事务的回滚。
TransactionDefinition 是在 Spring 中事务支持的核心接口
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
String getName();
int getTimeout();
boolean isReadOnly();
}
方法 | 描述 |
---|---|
int getPropagationBehavior() |
该方法返回传播行为。Spring 提供了与 EJB CMT 类似的所有的事务传播选项。 |
int getIsolationLevel() |
该方法返回该事务独立于其他事务的工作的程度。 |
String getName() |
该方法返回该事务的名称。 |
int getTimeout() |
该方法返回以秒为单位的时间间隔,事务必须在该时间间隔内完成。 |
boolean isReadOnly() |
该方法返回该事务是否是只读的。 |
Spring事务管理器配置
XML配置
XML 中配置事务一共分为三个步骤,以下一一介绍:
1、配置 TransactionManager
<!--开启事务第一步: 配置 TransactionManager(事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dynamicDataSource"/>
</bean>
2、配置事务要处理的方法
<!-- 开启事务管理第二步:事务要处理的方法 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="load*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="use*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="put*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="merge*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
注意,一旦配置了方法名称规则之后,service 中的方法一定要按照这里的名称规则来,否则事务配置不会生效
3、配置 AOP
<!-- 开启事务第三步:配置方式开启事务 -->
<aop:config proxy-target-class="true" expose-proxy="true">
<aop:pointcut id="serviceOperation" expression="execution(* com.inchlifc.service.*.*(..))"/>
<aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/>
</aop:config>
Java配置
如果要开启 Java 注解配置,在 XML 配置中添加如下配置:
<tx:annotation-driven transaction-manager="transactionManager" />
这行配置,可以代替下面两个配置:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*"/>
<tx:method name="insert*"/>
<tx:method name="add*"/>
<tx:method name="delete*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:config proxy-target-class="true" expose-proxy="true">
<aop:pointcut id="serviceOperation" expression="execution(* com.inchlifc.service.*.*(..))"/>
<aop:advisor pointcut-ref="serviceOperation"
advice-ref="txAdvice"/>
</aop:config>
然后,在需要添加事务的方法上,添加 @Transactional 注解,表示该方法开启事务,当然,这个注解也可以放在类上,表示这个类中的所有方法都开启事务。
来源:CSDN
作者:小小渔夫
链接:https://blog.csdn.net/cx243698/article/details/104625490