我有两张桌子 A 和 B 。我的应用程序不断执行包含以下内容的事务:
(这两个步骤属于同一交易,以保持表格 A 和 B 相互一致。)
在任何时候 t ,我需要一种方法来获取表格的快照。更具体地说,在任何时候 t ,我需要表 B 中特定行的值,我需要在表格中插入的行 A 在上次更新表格 B 的行的交易中。
例如,在 t0 时,我的表格包含以下内容:
表A => (rowA1)
表B => (rowB11,rowB12)
行 rowB11 和 rowB12 已插入到将表 A 中的行更新为状态 rowA1 <的事务中/强>
在 t1 时,再次执行交易,我的表现在有以下内容:
表A =&gt; (rowA2)
表B =&gt; (rowB11,rowB12,rowB21,rowB22)
行 rowB21 和 rowB22 已插入到移动表 A 中的行的事务中 rowA1 表示 rowA2 。
现在,在任何时候 t ,我想选择表格 A 中的行(即现在它 rowA2 并且还要选择已插入的行以达到状态 rowA2 (即 rowB21 和 rowB22 )。我不想要的是选择表格中的行 A (即 rowA2 )并获取行 rowB31 和 B 中的> rowB32 ,因为我从表格 A 获得的状态与这些插入的行(刚刚在静止运行期间插入的行)不匹配交易)。
我希望我的问题很清楚。
我确切地说我使用MySQL并使用Spring管理我的交易。
谢谢, 迈克尔
修改
最后,仅使用事务级别至少为READ_COMMITTED
的事务是不够的。如果在两个SELECT
之间(一个用于获取表 A 中一行的当前状态,另一个用于获取表 B中与此状态关联的行),执行一个或多个其他事务(即步骤1-2的一个或多个执行),从表 B 获取的行将不对应于先前从表中获取的行的状态的 A
答案 0 :(得分:1)
在B
中添加一列,您可以将B
中的行与A
中的特定状态进行匹配:
时间 t0 :
表A =&gt; (rowA1)
表B =&gt; (rowB11,rowA1),(rowB12,rowA1)
时间 t1 :
表A =&gt; (rowA2)
表B =&gt; (rowB11,null),(rowB12,null),(rowB21,rowA2),(rowB22,rowA2)
在 t1 ,您想要的 B 中的行类似于SELECT * FROM B WHERE ref_to_A = [current_value_in_A]
。
毕竟,你的问题似乎与交易隔离有关。所以我们走了:
在事务期间发生的任何事情(除非隔离级别为
READ_UNCOMMITTED
),即在BEGIN
和COMMIT
(或ROLLBACK
之间),对于并发事务是不可见的。< / p>