我已将C#代码的隔离级别设置为readcommitted,并且我正在调用存储过程,由于某种原因该过程正在超时。该存储过程没有任何set isolation level
语句。
在SQL Server中,数据库级别的隔离级别是读取已提交的快照。
那么将使用哪个隔离级别?在SQL Server中定义的一个,还是在C#中定义的一个?
答案 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上,您可以设置默认的事务隔离级别,但这只是默认设置。