【MySQL】Spring中的事务管理

13 篇文章 1 订阅

 

Spring不直接管理事务,它提供了事务管理器,但是具体相关管理职责由 Hibernate、MyBatis 等持久层框架实现。由这些持久层框架实现与数据库服务的通信。

 

@Transactional

使用Spring提供的事务框最普遍的方式是 在事务方法上添加标记 @Transactional,并设置相关属性。如:

Java代码

 

  1. @Transactional(propagation=Propagation.REQUIRED,  

  2.     isolation=Isolation.REPEATABLE_READ)  

  3. public void runInTransaction() {  

  4.   ...  

  5. }  

Java代码

 

  1. public @interface Transactional {  

  2.   // 事务的 名称  

  3.   String value default "";  

  4.     

  5.   // 事务的 传播方式  

  6.   Propagation propagation() default Propagation.REQUIRED;  

  7.   

  8.   // 事务的 隔离级别  

  9.   Isolation isolation() default Isolation.DEFAULT;  

  10.   

  11.   // 事务的 超时时长  

  12.   int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;  

  13.   

  14.   // 事务是否 只读  

  15.   boolean readOnly() default false;  

  16.   

  17.   // 遇到这些异常时 触发事务回滚。默认遇到 RuntimeException 和 Error 时回滚;受检异常不回滚。  

  18.   Class<? extends Throwable>[] rollbackFor() default();  

  19.   

  20.   // 其它回滚机制设置  

  21.   String[] rollbackForClassName() default {};  

  22.   

  23.   Class<? extends Throwable>[] noRollbackFor() default {};  

  24.   

  25.   String[] noRollbackForClassName() default {};  

  26. }  

 

PlatformTransactionManager

PlatformTransactionManager 是 Spring 事务管理架构中的中央接口。

实际使用时一般通过注解的形式(AOP)使用,而不是直接调用这些方法。

 

Java代码

 

  1. public interface PlatformTransactionManager {  

  2.   // 获取事务的状态  

  3.   TransactionStatus getTransaction(TransactionDefinition definition);  

  4.   

  5.   // 提交事务  

  6.   void commit(TransactionStatus status);  

  7.   

  8.   // 回滚事务  

  9.   void rollback(TransactionStatus status)  

  10. }  

 

TransactionDefinition

TransactionDefinition 定义了事务的一些属性,包括“传播行为”、“隔离级别”、“是否只读”、“超时时长”、“名称”。

这些属性会在 Spring事务管理机制 中被使用。

传播行为 用于处理事务嵌套的情况;

隔离级别 用于处理事务并发的情况;

事务 超时时长 表示允许事务执行的最长时间。如果事务超时未完成,就会自动回滚;

事务 只读 表示对事务性资源只读。如果确定事务只包含读操作,可将其标记为只读,以提高性能。

Java代码

 

  1. public interface TransactionDefinition {  

  2.   // 获取事务的 传播行为  

  3.   int getPropagationBehavior();  

  4.   

  5.   // 获取事务的 隔离级别  

  6.   int getIsolationLevel();  

  7.   

  8.   // 获取事务的 超时时长  

  9.   int getTimeout();  

  10.   

  11.   // 判断事务 是否只读  

  12.   boolean isReadOnly();  

  13.   

  14.   // 获取事务 名称  

  15.   String getName();  

  16. }  

 

TransactionStatus

TransactionStatus 提供了一组方法用于获取事务的状态。

Java代码

 

  1. public interface TransactionStatus {  

  2.   // 判断事务 是否为新建的事务  

  3.   boolean isNewTransaction();  

  4.   

  5.   // 判断事务 是否有保存点  

  6.   boolean hasSavepoint();  

  7.   

  8.   // 将事务设置为 只回滚  

  9.   void setRollbackOnly();  

  10.   

  11.   // 判断事务 是否为只回滚  

  12.   boolean isRollbackOnly();  

  13.   

  14.   // 判断事务 是否已完成  

  15.   boolean isCompleted();  

  16. }  

 

Spring 支持的事务隔离级别

对事务的支持是由数据库提供的。Spring 只是个框架,它方便我们使用数据库提供的事务特性。

SQL-1992 中定义的4个隔离级别在Spring中都有对应的标识。

此外Spring还提供了一个隔离级别标识,Isolation_Default,用于使用数据库默认的隔离级别。

 

Spring 的事务传播行为控制

Spring 的事务传播行为控制机制用于支持业务层中的事务嵌套场景。

当一个事务方法被另一个事务方法调用时,这个被调用的事务方法可能需要在当前事务中运行,也有可能需要新开一个事务运行。

Spring定义了 7种 事务传播行为:

 

支持当前事务的传播行为

  • Propagation_Required:如果当前存在事务,则加入当前事务;否则创建一个新事务。(默认)

  • Propagation_Supports:如果当前存在事务,则加入当前事务;否则以非事务的方式运行。

  • Propagation_Mandatory:如果当前存在事务,则加入当前事务;否则抛出异常。

 

不支持当前事务的传播行为

  • Propagation_Requires_New:创建一个新事务。如果当前已经有事务,则挂起当前事务。

  • Propagation_Not_Supported:以非事务方式运行。如果当前已经有事务,则挂起当前事务。

  • Propagation_Never:以非事务方式运行。如果当前已经有事务,则抛出异常。

 

其它传播行为

    • Propagation_Nested:如果当前存在事务,则创建一个新事务作为嵌套事务运行;否则创建一个新事务。

前 6种 传播行为借鉴自EJB,概念相同。PROPAGATION_NESTED 是 Spring 特有的。

内嵌事务基于JDBC的 SavePoint 实现。

只有外部事务提交,内嵌事务才能提交。

外部事务回滚,会引起内嵌事务回滚。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值