我有两个表A和B。我的应用程序连续执行以下事务:
在表B中插入行。
更新表a中的行。
(这两个步骤属于同一事务,以保持表A和表B相互一致。)
任何时候,我都需要一种方法来获取表的快照。更具体地说,在任何时候t,我都需要表B中特定行的值,并且需要在上次更新表B的行的事务期间插入表a中的行。
例如,在时间t0,我的表具有以下内容:
表A=>(第1行)
表B=>(第11行,第12行)
行b11和行b12已插入到将表A中的行更新为状态rowA1的事务中。
在时间t1,事务再次执行,我的表现在具有以下内容:
表A=>(第2行)
表B=>(第11行、第12行、第B21行、第B22行)
行B21和行B22已插入到将表A中的行从状态行A1移动到状态行A2的事务中。
现在,在任何时候t,我想选择表A中的行(即现在是rowA2),并选择已经插入的行以到达状态rowA2(即rowB21和rowB22)。我不希望的是选择表A中的行(即rowA2),并从表B中获取行b31和行b32,因为从表A获得的状态与这些插入的行不匹配(这些行只是在仍在运行的事务期间插入的)。
我希望我的问题足够清楚。
我使用MySQL,使用Spring管理事务。
谢谢,
米克尔
编辑:
最后,仅仅使用事务级别至少READ_COMMITTED的事务是不够的。如果在两个SELECTs之间(获取表a中某行的当前状态和获取表B中与此状态相关联的行的状态),执行一个或多个其他事务(即执行一个或多个步骤1-2),则从表B获取的行将与以前从表a获取的行的状态不对应。

最佳答案

B中添加一列,允许您将B中的行与A中的特定状态匹配:
时间t0:
表A=>(第1行)
表B=>(第11行,第A1行),(第12行,第A1行)
时间t1:
表A=>(第2行)
表B=>(行B11,空),(行B12,空),(行B21,行A2),(行B22,行A2)
在t1,B中的行与SELECT * FROM B WHERE ref_to_A = [current_value_in_A]类似。
看来您的问题毕竟与事务隔离有关。所以我们来:
在事务期间发生的任何事情(除非隔离级别是READ_UNCOMMITTED),即介于BEGINCOMMIT(或ROLLBACK)之间,对并发事务都是不可见的。

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

10-16 13:45