C# 中的隔离级别或 SQL - 将使用哪一个?

Isolation level in C# or SQL - which one will be used?

我在 C# 代码中将隔离级别设置为已提交,并且我正在调用一个由于某种原因超时的存储过程。存储过程没有任何 set isolation level 语句。

在SQL服务器中,数据库级隔离级别是读提交快照。

那么将使用哪个隔离级别?是在SQL Server 中定义的,还是C#中定义的?

没有 'database isolation level' 这样的东西。你描述的是一个数据库选项,叫做 READ_COMMITTED_SNAPSHOT:

READ_COMMITTED_SNAPSHOT { ON | OFF } ON Enables Read-Committed Snapshot option at the database level. When it's enabled, DML statements start generating row versions even when no transaction uses Snapshot Isolation. Once this option is enabled, the transactions specifying the read committed isolation level use row versioning instead of locking.

因此,当 READ_COMMITTED_SNAPSHOT 开启时,指定读取已提交隔离级别的事务将改为看到快照隔离级别。

重要的是要了解还有另一个数据库选项:ALLOW_SNAPSHOT_ISOLATION 必须将 设置为 ON 才能进行快照隔离。参见 Snapshot Isolation in SQL Server

如有疑问,您可以随时查看 sys.dm_tran_current_transaction,其中有一个名为 transaction_is_snapshot:

的列

Snapshot isolation state. This value is 1 if the transaction is started under snapshot isolation. Otherwise, the value is 0.

此外,真正的快照隔离级别与由 READ_COMMITTED_SNAPSHOT 更改为快照的读取提交隔离之间存在细微差别。

设置事务隔离级别的命令按接收顺序处理。所以最后一个赢了。在 SQL Server 上,您可以设置默认的事务隔离级别,但只是一个默认值。