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

时间:2019-05-21 18:48:42

标签: c# sql-server isolation-level transaction-isolation

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

在SQL Server中,数据库级别的隔离级别是读取已提交的快照。

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

2 个答案:

答案 0 :(得分:3)

没有“数据库隔离级别”之类的东西。您所描述的是一个名为READ_COMMITTED_SNAPSHOT的数据库选项:

  

READ_COMMITTED_SNAPSHOT { ON | OFF } ON在数据库级别启用“已提交快照”选项。启用后,即使没有事务使用快照隔离,DML语句也开始生成行版本。启用此选项后,指定读取的提交隔离级别的事务将使用行版本控制而不是锁定。

因此,当READ_COMMITTED_SNAPSHOT处于启用状态时,指定读取已提交隔离级别的事务将改为查看快照隔离级别。

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

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

  

快照隔离状态。如果在快照隔离下启动事务,则此值为1。否则,值为0。

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

答案 1 :(得分:0)

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