查询在事务内修改的多个表

时间:2014-05-21 13:13:31

标签: java mysql transactions

我有两张桌子 A B 。我的应用程序不断执行包含以下内容的事务:

  1. 在表格 B
  2. 中插入行
  3. 更新表格 A
  4. 中的一行

    (这两个步骤属于同一交易,以保持表格 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

1 个答案:

答案 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),即在BEGINCOMMIT(或ROLLBACK之间),对于并发事务是不可见的。< / p>