交易和交易传播
#database #java #spring #springboot

让我们开始这篇文章,了解什么是交易

Image description

什么是交易?

用简单的术语定义,交易是一个原子能单位。在软件应用程序的背景下,它代表了一个由多个操作组成的单个连贯的工作单元。

交易主要属于数据库的上下文。数据库中的事务代表一个工作单位,该工作由多个数据库操作组成,例如插入,选择,更新或删除。当交易由数据库本身管理时,与数据库连接的软件应用程序在启动和控制交易中起着至关重要的作用。

交易是关系数据库的基本方面,甚至某些非关系数据库也提供了交易能力。

为什么需要交易?

使用交易的目的是确保数据完整性和一致性。当将多个操作分组为交易时,它们要么成功完成,要么没有应用它们,这有助于维持数据的准确性和可靠性。

电子商务,银行和金融,保留系统和供应链管理是一些范例的示例,其软件应用程序需要具有一致且准确的数据来执行操作而无需差异并保证可靠的客户体验。

让我们以电子商务网站购买产品的例子。单击“购买产品”按钮时,确认订单。为了确认订单,可以进行多个操作,例如检查产品可用性,保留产品,更新库存,创建订单,付款和订单确认。

这只是一个例子,在实际情况下,发生了更复杂的操作。

购买产品方法被放置在交易上下文中,以确保所有操作都发生或没有发生。

Image description
该注释用于春季应用程序来定义和管理方法的交易。

@transactional 默认情况下标记方法时:

  • 如果方法通过方法抛弃了任何RuntimeException,则会回滚
  • 如果方法被抛出任何检查异常,则不会回滚

可以通过传递特定 RuntimeExceptions 检查异常 rollbackfor 和<强> norollbackfor @transactional 注释的参数

@Transactional(
            rollbackFor = DuplicateUserException.class,
            noRollbackFor = IllegalArgumentException.class
)

交易传播

在春季应用程序中,要在交易上下文中执行一种方法, @transactional 在方法之上注释。当一种具有事务的方法调用多个其他方法时,交易将从一种方法传播到另一种方法。我们可能希望根据其功能的不同方法来管理交易的传播行为。

从上面的示例中,我们知道单个动作(例如购买产品)涉及执行几个单独的任务。买入方法将包括所有单独的方法调用以组成单个凝聚力单元。

Image description

传播

默认情况下,将传播设置为必需。当方法用 @transactional(paspagation = papagation.equired) 注释方法时,该方法将始终需要交易上下文来执行。

繁殖标记的方法。从另一种方法调用时

  • 如果没有交易,则创建了新事务
  • 如果已经存在事务,则该方法是在同一交易上下文中执行的

在我们的示例中,让我们说检查产品的可用性标记了所需的繁殖,因此它将在与购买产品方法的交易上下文中执行。

paspagation.requires_new

当方法用 @transactional(传播= papagation.requires_new)标记时从已经存在的交易的方法中调用。

可能有一个要求,以便如果发送邮件(例如发送邮件)是购买产品方法的一部分,则出于某种原因不希望整个交易失败。因为发送邮件不应影响客户购买产品的客户。

传播

顾名思义,当一种方法用 @transactional(passagation = papagation.mandatory) 标记时,它总是需要交易上下文来执行。

  • 使用此传播不会创建自己的交易,但请确保调用方法时存在交易上下文。
  • 用强制性标记的方法从没有任何交易的方法中调用,而事务管理器的例外将失败

传播

当标记的方法用 @transactional(paspagation = papagation.never) 标记时,这意味着永远不要需要执行的交易上下文。

如果一种方法用传播标记。永不言之并从具有交易上下文的方法中调用,则它将在例外。它的表现是传播的相反。

繁殖

当方法用 @transactional(paspagation = papagation.never) 标记时,该方法可以从交易上下文或没有交易上下文中调用。<

顾名思义,它支持在事务上下文中执行,但并未在称为方法交易上下文中创建新事务而不是在其中执行。同时,该方法也可以从没有交易上下文的方法中调用,就像普通方法一样。 繁殖。

传播

@transactional(传播= papagation.not_supported)标记方法时,该方法在没有交易的情况下执行。

该方法可以从具有交易的方法或没有交易的方法中调用。但是,即使从具有事务上下文的方法调用时,用 expagation.not_supported 标记的方法始终在任何事务上下文中执行。

让您说购买产品由一种具有单个选择查询的方法组成,该方法可以从数据库中读取数据。逻辑上,此方法不需要执行任何交易,因为它没有对数据库进行任何更改。


如果您喜欢这个帖子,请留下反应,我们将在另一个帖子中介绍交易隔离