如果我有一张表格如下:
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();
}
答案 0 :(得分:4)
两个UPDATE
语句将按顺序运行。因此,第二个UPDATE
会在第一个UPDATE
完成之前一直运行。
假设这两个语句是同一事务的一部分(在本例中它们将是这个),则阻止其他会话读取中间状态,其中两行的值都为" John"通过事务隔离级别。 Oracle不允许脏读。通常,Oracle中的所有内容都在读提交的事务隔离级别中运行。这意味着其他会话将在事务开始之前看到值,直到您的事务提交为止,此时两个语句(以及事务中的任何其他内容)都将完成。