我们使用 ADO.NET 连接到 SQL 2005 服务器,并在其中执行大量插入/更新和选择。我们将其中一项更新更改为事务内部,但当我们执行此操作时,它似乎 (b) 锁定了整个表,无论我们在事务上设置的隔离级别如何。
我看到的行为是:
- 如果您没有任何交易,那么这就是一场全力以赴的战斗(失败者陷入僵局)
- 如果您有几笔交易,那么他们总是会获胜并阻止所有其他交易,除非
- 如果您有一些交易,并且对其余交易设置了类似 nolock 的内容,那么您将获得交易并且不会阻塞任何交易。 这是因为无论事务如何,每个语句(选择/插入/删除/更新)都有一个隔离级别。
这是正确的吗?
最佳答案
您的问题的答案是:这取决于情况。
如果要更新表,SQL Server 会使用多种策略来决定锁定多少行、行级锁、页锁或全表锁。
如果您更新的表的比例超过一定比例(我记得是可配置的),那么 SQL Server 会给您一个表级锁,这可能会阻止选择。
最好的引用是:
- 了解 SQL Server 中的锁定: http://msdn.microsoft.com/en-us/library/aa213039(SQL.80).aspx (适用于 SQL Server 2000)
- SQL Server 中的锁定简介:http://www.sqlteam.com/article/introduction-to-locking-in-sql-server
- 数据库引擎中的隔离级别:http://msdn.microsoft.com/en-us/library/ms189122.aspx (适用于 SQL Server 2008,但也提供 2005 版本)。
祝你好运。
关于SQL 事务 (b) 锁定选择 - 我的理解正确吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720475/