同一BEGIN-END块中的两个UPDATE语句是否在同一时间执行

本文关键字:语句 UPDATE 两个 是否 执行 同一时间 BEGIN-END 同一 | 更新日期: 2023-09-27 17:52:54

如果我有一个这样的表:

CID COLUMN1
1   Joe
2   John

然后运行下面的代码。是否可以执行Select语句(在一些不合适的精确毫秒,大约在我的代码运行的一半),这将返回COLUMN1 = John表中的两行?或者Oracle会在我的代码中"一起"运行这两个更新语句,所以这种情况永远不会发生。

string sqlStr = @"Begin
              Update TABLE1 set COLUMN1 = 'John' where CID = 1;
              Update TABLE1 set COLUMN1 = 'Joe' where CID = 2;
              End;";
OracleConnection conn = new OracleConnection(oracle_connstr);
OracleCommand cmd = new OracleCommand(sqlStr, conn);
try
{
        conn.Open();
        cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
}
finally
{
        if (cmd != null) cmd.Dispose();
        if (conn != null) conn.Dispose();
}

同一BEGIN-END块中的两个UPDATE语句是否在同一时间执行

两个UPDATE语句将依次运行。因此,在第一个UPDATE完成之前,第二个UPDATE不会运行。

假设这两个语句是同一事务的一部分(在本例中它们是),事务隔离级别阻止其他会话读取两个行都具有"John"值的中间状态。Oracle不允许脏读。通常情况下,Oracle中的所有内容都运行在读取提交事务隔离级别。这意味着其他会话将在您的事务开始之前看到这些值,直到您的事务提交,此时两个语句(以及作为事务一部分的任何其他内容)都将完成。