gpt4 book ai didi

java - 查询事务内修改的多个表

转载 作者:行者123 更新时间:2023-11-29 00:13:33 25 4
gpt4 key购买 nike

我有两个表AB。我的应用程序持续执行包含以下内容的事务:

  1. 在表 B 中插入行。
  2. 更新表 A 中的一行。

(这两个步骤属于同一个事务,以保持表AB相互一致。)

在任何时候 t,我都需要一种方法来获取表的快照。更具体地说,在任何时间 t,我需要表 B 中特定行的值,并且我需要插入表 A 中的行在上次更新表 B 行的事务期间。

例如,在时间t0,我的表格有以下内容:

表 A =>(行 A1)

表 B =>(行 B11,行 B12)

rowB11rowB12 已插入事务中,该事务将表 A 中的行更新为状态 rowA1.

在时间t1,事务再次执行,我的表现在有以下内容:

表 A =>(行 A2)

表 B =>(行 B11、行 B12、行 B21、行 B22)

rowB21rowB22 已插入到将表 A 中的行从状态 rowA1 声明 rowA2

现在,在任何时间 t,我想选择表 A 中的行(即现在是 rowA2)并且还选择已插入的行以达到状态 rowA2(即 rowB21rowB22)。我不想要的是选择表 A 中的行(即 rowA2)并获取行 rowB31rowB32 来自表 B 因为我从表 A 获得的状态与这些插入的行不匹配(刚刚在仍在运行的事务中插入)。

我希望我的问题足够清楚。

确切地说,我正在使用 MySQL,并且我使用 Spring 管理我的事务。

谢谢,迈克尔


编辑:

最后,简单地使用事务级别至少为 READ_COMMITTED 的事务是不足够的。如果介于两者之间SELECT s(一个获取表 A 中行的当前状态,一个获取表 B 中与此状态关联的行),一个或多个其他事务是已执行(即一次或多次执行步骤 1-2),从表 B 获取的行将不对应于先前从表 A 获取的行的状态。

最佳答案

B 中添加一列,允许您将 B 中的行与 A 中的特定状态相匹配:

时间t0:

表 A =>(行 A1)
表 B =>(行 B11,行 A1),(行 B12,行 A1)

时间t1:

表 A =>(行 A2)
表 B =>(行 B11,空),(行 B12,空),(行 B21,行 A2),(行 B22,行 A2)

t1B 中您想要的行类似于 SELECT * FROM B WHERE ref_to_A = [current_value_in_A]


毕竟,您的问题似乎与事务隔离有关。所以我们开始吧:

Anything that happens during a transaction (unless isolation level is READ_UNCOMMITTED), i.e. between BEGIN and COMMIT (or ROLLBACK), is invisible to concurrent transactions.

关于java - 查询事务内修改的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23784256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com