【发布时间】:2009-06-25 14:07:08
【问题描述】:
我是构建基于 ADO.NET 的网站的团队的一员。有时我们有几个开发人员和一个自动化测试工具同时工作一个数据库的开发副本。
我们使用快照隔离级别,据我所知,它使用乐观并发:而不是锁定,它希望最好,如果受影响的行已被更改,则如果您尝试提交事务,则会引发异常交易过程中的另一方。
要使用我们使用的快照隔离级别:
ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
在 C# 中:
Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
请注意,IsolationLevel Snapshot 与 ReadCommitted Snapshot 不同,我们也尝试过,但目前没有使用。
当其中一位开发人员进入调试模式并暂停 .NET 应用程序时,他们将在调试时保持与活动事务的连接。现在,我希望这不是问题——毕竟,所有事务都使用快照隔离级别,所以当一个事务暂停时,其他事务应该能够正常进行,因为暂停的事务没有持有任何锁。当然,当暂停的事务完成时,很可能会检测到冲突;但这是可以接受的,只要其他开发人员和自动化测试可以不受阻碍地进行。
然而,实际上,当一个人在调试时暂停事务时,尽管使用了快照隔离级别,但尝试访问相同行的所有其他数据库用户都会被阻止。
有谁知道为什么会发生这种情况,和/或我如何才能实现真正的乐观(非阻塞)并发?
决议(对我来说是一个不幸的决议):Remus Rusanu 指出作家总是阻止其他作家;这得到了MSDN 的支持——它并没有完全说出来,但只提到了避免读写器锁。简而言之,我想要的行为并没有在 SQL Server 中实现。
【问题讨论】:
标签: sql sql-server ado.net isolation-level