假设我在 C# 中有这个脚本
....
string _commandStr = "SELECT * FROM products";
if (connection.State == System.Data.ConnectionState.Closed)
connection.Open();
SqlCommand cmd = new SqlCommand(_commandStr, connection);
var reader = cmd.ExecuteReader();
while (reader.Read())
{
...some expensive formatting operation. This cycle takes minutes
}
现在,如果另一个进程在 READ 循环运行时将 Record 附加到 products 表会发生什么?在周期结束之前,最终记录是否可用?
SELECT
查询是否返回新插入(和提交)的行取决于:
在关闭选项READ_COMMITTED
的数据库中使用隔离级别READ_COMMITTED_SHAPSHOT
时,可能会或可能不会返回新行,具体取决于新插入的行是在SELECT
查询扫描点之前还是之后。
随着READ_COMMITTED
与数据库的隔离级别READ_COMMITTED_SHAPSHOT
的选项,新行将不予退还。查询结果反映了SELECT
查询开始时的数据,因此不会返回新插入的行。
使用SNAPSHOT
隔离级别,查询结果反映SELECT
查询(或显式事务)开始时的数据,因此不会返回新插入的行。
使用REPEATABLE_READ
隔离级别,根据新行是在SELECT
查询扫描点之前或之后插入之前,可能会或可能不会返回新行。
使用SERIALIZABLE
隔离级别,不会返回新行,因为在SELECT
查询全扫描期间并发插入将被阻止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句