Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。下面分别介绍这两种方式及其实现方式:
编程式事务管理是通过编写代码来手动管理事务。它需要在事务的开始和结束时,通过编程方式来控制事务的提交和回滚。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()
方法中,我们手动管理了事务的开始、提交和回滚等操作。
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
是 Spring Framework 中最常用的事务注解之一,它可以用来标识需要进行事务管理的方法或类。@Transactional
注解可以指定事务的传播行为、隔离级别、超时时间、只读属性、回滚规则等属性。以下是对 @Transactional
注解的详细解析:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
Spring 中的事务传播行为(Propagation)指的是多个事务之间的相互影响关系,即在一个事务方法调用另一个事务方法时,这两个事务方法之间的关系。
Spring Framework 中定义了 7 种事务传播行为,分别为:
Propagation.REQUIRED
:默认值,如果当前存在事务,则加入该事务,否则创建一个新事务。Propagation.SUPPORTS
:如果当前存在事务,则加入该事务,否则以非事务方式执行。Propagation.MANDATORY
:如果当前存在事务,则加入该事务,否则抛出异常。Propagation.REQUIRES_NEW
:创建一个新事务,并挂起当前事务(如果存在)。Propagation.NOT_SUPPORTED
:以非事务方式执行,并挂起当前事务(如果存在)。Propagation.NEVER
:以非事务方式执行,如果当前存在事务,则抛出异常。Propagation.NESTED
:如果当前存在事务,则在嵌套事务中执行,否则创建一个新事务。事务隔离级别指的是多个事务之间的数据隔离程度。Spring Framework 中定义了 5 种事务隔离级别,分别为:
Isolation.DEFAULT
:使用数据库的默认隔离级别。Isolation.READ_UNCOMMITTED
:最低的隔离级别,允许读取未提交的数据。Isolation.READ_COMMITTED
:允许读取已提交的数据。Isolation.REPEATABLE_READ
:保证在同一事务中多次读取同一数据时,得到的结果是一致的。Isolation.SERIALIZABLE
:最高的隔离级别,完全禁止不可重复读和幻读。事务超时时间指的是事务执行所允许的最大时间。如果事务执行时间超过了指定的超时时间,则事务会被回滚。超时时间的单位为秒,默认值为 -1,表示永不超时。
只读属性指的是事务是否只读。如果将事务设置为只读,那么在事务执行期间,所有对数据库的修改操作都会被禁止。只读属性可以提高事务的并发性能。
回滚规则指的是哪些异常会导致事务回滚。可以使用 rollbackFor
、noRollbackFor
、rollbackForClassName
、noRollbackForClassName
等属性来指定回滚规则。其中,rollbackFor
和 noRollbackFor
属性用于指定需要回滚或不需要回滚的异常类型,而 rollbackForClassName
和 noRollbackForClassName
属性用于指定需要回滚或不需要回滚的异常类名。
以上是 @Transactional
注解的常用属性和含义。需要注意的是,在使用 @Transactional
注解时,必须要将它所在的类或接口注册为 Spring Bean,且 @Transactional
注解只对 public 方法生效。