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

时间:2015-06-02 19:43:00

标签: c# oracle

如果我有一张表格如下:

CID COLUMN1
1   Joe
2   John

我在下面运行以下代码。是否可以执行Select语句(在我的代码运行的一半时间内,在一些不合时宜的精确毫秒内)将返回COLUMN1 = John表中的BOTH行?或者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();
}

1 个答案:

答案 0 :(得分:4)

两个UPDATE语句将按顺序运行。因此,第二个UPDATE会在第一个UPDATE完成之前一直运行。

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