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