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