Java 查询事务内部修改的多个表
我有两张桌子A和B。我的应用程序持续执行以下事务:Java 查询事务内部修改的多个表,java,mysql,transactions,Java,Mysql,Transactions,我有两张桌子A和B。我的应用程序持续执行以下事务: 在表B中插入行 更新表a中的一行 (这两个步骤属于同一事务,以保持表A和B相互一致。) 在任何时候t,我都需要一种方法来获取表的快照。更具体地说,在t的任何时候,我都需要表B中特定行的值,并且我需要在上次更新表B行的事务期间插入表a中的行 例如,在时间t0时,我的表格具有以下内容: 表A=>(第1行) 表B=>(第11行,第12行) 行行B11和行B12已插入将表A中的行更新为状态行A1的事务中 在时间t1时,事务再次执行,我的表现在有以下内容
编辑:
最后,仅仅使用事务级别至少为
READ\u COMMITTED
的事务是不够的。如果在两个之间选择
s(获取表a中一行的当前状态的一个和获取表B中与此状态关联的行的一个),则执行一个或多个其他事务(即,执行步骤1-2的一个或多个),从表B中提取的行与以前从表A中提取的行的状态不对应,请在B
中添加一列,允许您将B
中的行与A
中的特定状态匹配:
时间t0:
表A=>(第1行)表B=>(第B11行,第A1行),(第B12行,第A1行) 时间t1: 表A=>(第2行)
表B=>(行B11,空)、(行B12,空)、(行B21,行A2)、(行B22,行A2) 在t1中,您想要的B中的行类似于
SELECT*FROM B,其中ref\u to\u A=[当前\u值\u in\u A]
看来您的问题毕竟与事务隔离有关。现在我们开始: 在事务期间发生的任何事情(除非隔离级别为
READ\u UNCOMMITTED
),即BEGIN
和COMMIT
(或ROLLBACK
)之间,对并发事务是不可见的
谢谢你的回复。已经有一个外键,但它没有帮助,因为行总是更新的,因此外键总是指向同一行。将行插入到for each state更改中是有问题的,因为更改经常发生。好吧,“外键”是不合适的名称,但是肯定是从
B
到a
的引用,您可以使用它来区分B
中的行。直到现在,我认为在一个事务内部进行这两个选择时,隔离级别至少为READ\u COMMITTED就足够了,但我不确定。如果该事务被包装在一个事务中(除非READ\u UNCOMMITTED),那么在BEGIN
和COMMIT
之间发生的任何事情对于并发事务都是不可见的。