一、Spring事务管理方式及其实现
Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。下面分别介绍这两种方式及其实现方式:
1. 编程式事务管理
编程式事务管理是通过编写代码来手动管理事务。它需要在事务的开始和结束时,通过编程方式来控制事务的提交和回滚。Spring 提供了 PlatformTransactionManager
接口来实现编程式事务管理。通过该接口,我们可以手动管理事务的开始、提交和回滚等操作。
以下是一个简单的编程式事务管理的示例代码:
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
在上述示例中,我们使用 PlatformTransactionManager
接口实现了编程式事务管理。在 transferMoney()
方法中,我们手动管理了事务的开始、提交和回滚等操作。
2. 声明式事务管理
Spring 提供了多种声明式事务管理的方式,包括基于 XML 配置文件、基于注解和基于 Java 配置类等方式。
Spring 基于注解的声明式事务实现,可以通过在方法上添加事务注解来指定事务的属性和行为。Spring 提供了多个事务注解,包括 @Transactional
、@Rollback
、@Commit
等。其中,@Transactional
注解是最常用的事务注解,用于标识需要进行事务管理的方法。
以下是一个基于注解的声明式事务实现的示例代码:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
accountDao.update(fromAccount);
accountDao.update(toAccount);
}
基于注解的声明式事务实现可以更加方便地管理事务,避免了手动管理事务的繁琐和出错的可能性。同时,它也提高了代码的可读性和可维护性。
总之,Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。编程式事务管理需要手动管理事务的开始、提交和回滚等操作,而声明式事务管理则是通过在配置文件中声明事务规则,来自动管理事务。通过选择适合自己的方式,可以更加方便地实现事务管理。
二、@Transactional详解
@Transactional
是 Spring Framework 中最常用的事务注解之一,它可以用来标识需要进行事务管理的方法或类。@Transactional
注解可以指定事务的传播行为、隔离级别、超时时间、只读属性、回滚规则等属性。以下是对 @Transactional
注解的详细解析:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
1. 属性:事务传播行为(Propagation)
Spring 中的事务传播行为(Propagation)指的是多个事务之间的相互影响关系,即在一个事务方法调用另一个事务方法时,这两个事务方法之间的关系。
Spring Framework 中定义了 7 种事务传播行为,分别为:
-
Propagation.REQUIRED
:默认值,如果当前存在事务,则加入该事务,否则创建一个新事务。 -
Propagation.SUPPORTS
:如果当前存在事务,则加入该事务,否则以非事务方式执行。 -
Propagation.MANDATORY
:如果当前存在事务,则加入该事务,否则抛出异常。 -
Propagation.REQUIRES_NEW
:创建一个新事务,并挂起当前事务(如果存在)。 -
Propagation.NOT_SUPPORTED
:以非事务方式执行,并挂起当前事务(如果存在)。 -
Propagation.NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。 -
Propagation.NESTED
:如果当前存在事务,则在嵌套事务中执行,否则创建一个新事务。
2. 属性:事务隔离级别(Isolation)
事务隔离级别指的是多个事务之间的数据隔离程度。Spring Framework 中定义了 5 种事务隔离级别,分别为:
-
Isolation.DEFAULT
:使用数据库的默认隔离级别。 -
Isolation.READ_UNCOMMITTED
:最低的隔离级别,允许读取未提交的数据。 -
Isolation.READ_COMMITTED
:允许读取已提交的数据。 -
Isolation.REPEATABLE_READ
:保证在同一事务中多次读取同一数据时,得到的结果是一致的。 -
Isolation.SERIALIZABLE
:最高的隔离级别,完全禁止不可重复读和幻读。
3. 属性:事务超时时间(timeout)
事务超时时间指的是事务执行所允许的最大时间。如果事务执行时间超过了指定的超时时间,则事务会被回滚。超时时间的单位为秒,默认值为 -1,表示永不超时。
4. 属性:只读属性(readOnly)
只读属性指的是事务是否只读。如果将事务设置为只读,那么在事务执行期间,所有对数据库的修改操作都会被禁止。只读属性可以提高事务的并发性能。
5. 属性:回滚规则(rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName)
回滚规则指的是哪些异常会导致事务回滚。可以使用 rollbackFor
、noRollbackFor
、rollbackForClassName
、noRollbackForClassName
等属性来指定回滚规则。其中,rollbackFor
和 noRollbackFor
属性用于指定需要回滚或不需要回滚的异常类型,而 rollbackForClassName
和 noRollbackForClassName
属性用于指定需要回滚或不需要回滚的异常类名。文章来源:https://www.toymoban.com/news/detail-583012.html
以上是 @Transactional
注解的常用属性和含义。需要注意的是,在使用 @Transactional
注解时,必须要将它所在的类或接口注册为 Spring Bean,且 @Transactional
注解只对 public 方法生效。文章来源地址https://www.toymoban.com/news/detail-583012.html
到了这里,关于Spring Boot原理分析(四):声明式事务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!