gpt4 book ai didi

sql - 使用 IsolationLevel.Snapshot 但数据库仍处于锁定状态

转载 作者:行者123 更新时间:2023-12-02 15:59:27 26 4
gpt4 key购买 nike

我是构建基于 ADO.NET 的网站的团队的一员。有时,我们有多个开发人员和一个自动化测试工具同时工作数据库的开发副本。

我们使用快照隔离级别,据我所知,它使用乐观并发:它不是锁定,而是希望最好的结果,并且如果您尝试提交事务(如果受影响的行已被更改),则会抛出异常交易期间的另一方。

要使用快照隔离级别,我们使用:

ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;

在 C# 中:

Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);

请注意,IsolationLevel Snapshot 与 ReadComfilled Snapshot 不同,我们也尝试过,但目前尚未使用。

当其中一位开发人员进入 Debug模式并暂停 .NET 应用程序时,他们将在调试时保持与事件事务的连接。现在,我希望这不会成为问题 - 毕竟,所有事务都使用快照隔离级别,因此当一个事务暂停时,其他事务应该能够正常进行,因为暂停的事务没有持有任何锁。当然,当暂停的事务完成时,很可能会检测到冲突;但只要其他开发人员和自动化测试可以不受阻碍地进行,这是可以接受的。

然而,实际上,当一个人在调试时停止事务时,尽管使用了快照隔离级别,但尝试访问相同行的所有其他数据库用户都会被阻止。

有谁知道为什么会发生这种情况,和/或我如何实现真正的乐观(非阻塞)并发?

决议(对我来说很不幸):Remus Rusanu注意到作家总是阻止其他作家;这是由 MSDN 支持的- 它并没有完全这么说,但只提到避免读写器锁。简而言之,我想要的行为并未在 SQL Server 中实现。

最佳答案

SNAPSHOT 隔离级别与所有隔离级别一样,仅影响读取。写入仍然互相阻塞。如果您认为看到的是读 block ,那么您应该进一步调查并检查发生阻塞的资源类型和资源名称( sys.dm_exec_requests 中的 wait_type 和 wait_resource )。

我不建议为了支持开发人员连续盯着调试器几分钟的场景而更改代码。如果您认为这种情况可以在生产中重复(即客户端挂起),那么情况就不同了。为了实现您想要的目标,您必须最小化写入并在事务结束时在返回之前提交的单个调用中执行所有写入。这样任何客户端都不能长时间持有X锁(持有X锁时不能挂起)。实际上,这很难实现,并且需要开发人员在如何编写数据访问代码方面遵守很多纪律。

关于sql - 使用 IsolationLevel.Snapshot 但数据库仍处于锁定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1044164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com