【发布时间】:2011-12-24 02:03:02
【问题描述】:
我在旧版本的 SQL Server 中读到过,它有一个悲观的锁定策略。 IE。与 Oracle 不同,读者等待作者访问相同的数据(行或页级别)。
在较新的版本中仍然是这种情况吗?我听说最近的版本改变了锁定策略。
【问题讨论】:
标签: sql-server oracle locking
我在旧版本的 SQL Server 中读到过,它有一个悲观的锁定策略。 IE。与 Oracle 不同,读者等待作者访问相同的数据(行或页级别)。
在较新的版本中仍然是这种情况吗?我听说最近的版本改变了锁定策略。
【问题讨论】:
标签: sql-server oracle locking
您听说的是SNAPSHOT ISOLATION,自 SQL Server 2005 起可用。快照隔离,又名。行版本控制,是 Oracle 中的默认行为。您也可以在 SQL Server 中将其设为默认值,方法是在数据库上启用 READ_COMMITTED_SNAPSHOT:
ALTER DATABASE [<dbname>] SET READ_COMMITTED_SNAPSHOT ON;
使用行版本控制,SQL Server 在读取期间不会获取数据锁。如果发生并发写入,则读取将获取该行的先前版本。更多详情,请阅读Row Versioning-based Isolation Levels in the Database Engine。
您不应将行版本控制和快照与脏读混淆。 Dirty reads 提供inconsistent data,这让编程成为一项挑战,至少可以这么说(即,你不应该使用它!)。快照读取始终提供数据的事务一致图像。
【讨论】:
默认情况下,SQL Server 使用 READ COMMITTED 隔离级别,这意味着它将等待未提交的更改,然后再尝试读取它们。
http://msdn.microsoft.com/en-us/library/ms173763.aspx
请注意,如果您不关心返回数据的准确性,您始终可以将隔离级别设置为 Read Uncommitted,这将在晚上为您提供所有具有绑定更改的记录
您还可以使用快照隔离级别,这将为您提供所有记录,包括当前正在修改的最新已知数据版本,没有当前修改.
【讨论】:
锁定策略是在一个连接一个连接的基础上处理的 - 这是一个可以由应用程序和 SQL Server 本身设置的东西。
阅读Transaction Isolation Levels了解更多详情。
【讨论】: