65.9K
CodeProject 正在变化。 阅读更多。
Home

事务传播机制:理解类型及其用途

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024年10月10日

CPOL

3分钟阅读

viewsIcon

1421

在Java和Spring框架开发领域,事务管理对于确保数据一致性和完整性至关重要。 事务管理的一个基本方面是事务传播。

1. 什么是事务传播?

事务传播决定了事务如何跨不同的方法调用或服务处理。 它定义了一个方法是应该加入现有的事务、创建一个新的事务,还是以特定方式参与。

1.1 REQUIRED:加入现有事务或创建一个新的事务

REQUIRED 传播类型是默认且最常用的。 当调用具有 REQUIRED 传播的方法时,如果存在事务,它将加入现有的事务。 如果不存在事务,则将创建一个新事务。
代码示例
@Service
public class TransactionService {

    @Transactional(propagation = Propagation.REQUIRED)
    public void performTransactionalOperation() {
        // Business logic here
    }
}
演示结果
场景 1:如果从另一个事务性方法调用 performTransactionalOperation(),它将加入现有事务。
场景 2:如果从非事务性上下文调用,它将启动一个新事务。

1.2 REQUIRES_NEW:始终创建一个新事务

使用 REQUIRES_NEW,始终启动一个新事务,即使存在现有事务。 当您希望某些操作独立于当前事务时,这会很有用。
代码示例
@Service
public class TransactionService {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void performIndependentOperation() {
        // Business logic here
    }
}
场景:即使在现有事务中调用 performIndependentOperation(),它也会在单独的事务中执行。 在此方法中所做的更改将独立于外部事务进行提交或回滚。

1.3 MANDATORY:必须加入现有事务

MANDATORY 传播类型要求必须存在事务。 如果没有活动事务,将抛出异常。 当一个方法不应该在没有现有事务的情况下执行时,可以使用它。
代码示例
@Service
public class TransactionService {

    @Transactional(propagation = Propagation.MANDATORY)
    public void performOperationWithMandatoryTransaction() {
        // Business logic here
    }
}
场景:如果从非事务性上下文调用 performOperationWithMandatoryTransaction(),它将抛出异常。 如果从现有事务中调用,它将参与其中。

1.4 NEVER:在没有事务的情况下执行

NEVER 传播类型指定方法不得在事务中运行。 如果事务处于活动状态,将抛出异常。
代码示例
@Service
public class TransactionService {

    @Transactional(propagation = Propagation.NEVER)
    public void executeWithoutTransaction() {
        // Business logic here
    }
}
场景:如果在事务中调用 executeWithoutTransaction(),它将抛出异常。 如果从非事务性上下文中调用,它将正常执行。

2. 如何选择正确的传播类型?

选择正确的事务传播类型取决于您的应用程序的具体要求。 以下是一些指南

2.1 何时使用 REQUIRED

  • 用例:大多数常见场景,您希望方法参与现有事务,如果不存在事务,则创建一个新事务。
  • 示例:在服务中更新用户资料,该服务应与同一事务中的其他操作一起提交。

2.2 何时使用 REQUIRES_NEW

  • 用例:当某些操作需要独立于主事务提交时。
  • 示例:在单独的事务中记录用户操作,以确保即使主事务失败,日志条目也能保留。

2.3 何时使用 MANDATORY

  • 用例:当您需要确保方法始终在现有事务中执行时。
  • 示例:验证或必须作为正在进行的事务一部分的关键操作。

2.4 何时使用 NEVER

  • 用例:当您需要确保方法从不参与事务时。
  • 示例:不应受到事务管理影响的只读操作。

3. 结论

了解不同类型的事务传播对于在Java应用程序中进行有效的事务管理至关重要。 通过选择适当的传播类型,您可以确保您的应用程序以最有效的方式处理事务,满足一致性和性能要求。
如果您有任何问题或需要进一步澄清事务传播类型,请随时在下方评论!

在以下网址阅读更多文章事务传播方法:理解类型及其用途

© . All rights reserved.