Java 查询事务内部修改的多个表

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时,事务再次执行,我的表现在有以下内容

我有两张桌子AB。我的应用程序持续执行以下事务:

  • 在表B中插入行
  • 更新表a中的一行
  • (这两个步骤属于同一事务,以保持表AB相互一致。)

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

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

    表A=>(第1行)

    表B=>(第11行,第12行)

    行B11行B12已插入将表A中的行更新为状态行A1的事务中

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

    表A=>(第2行)

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

    行B21行B22已插入将表A中的行从状态行A1移动到状态行A2的事务中

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

    我希望我的问题足够清楚

    我使用MySQL,并使用Spring管理事务

    谢谢, 米克尔


    编辑:


    最后,仅仅使用事务级别至少为
    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
    之间发生的任何事情对于并发事务都是不可见的。