SQL Server:读者是否等待编写者(对于相同的数据)?

时间:2011-12-23 17:30:27

标签: sql-server oracle locking

我已经读过旧版本的SQL Server ..它有一个悲观的锁定策略。即与Oracle不同,读者等待编写者访问相同的数据(行或页面级别)。

在较新版本中仍然如此吗?我已经读过锁定策略在最近的版本中已经改变了。

3 个答案:

答案 0 :(得分:5)

您所听到的是SNAPSHOT ISOLATION,自SQL Server 2005以来可用。快照隔离,又名。行版本控制,是Oracle中的默认行为。通过在数据库上启用READ_COMMITTED_SNAPSHOT,您也可以在SQL Server中将其设置为默认值:

ALTER DATABASE [<dbname>] SET READ_COMMITTED_SNAPSHOT ON;

使用行版本控制SQL Server在读取期间不会获取数据锁定。如果发生并发写入,则读取将获取该行的先前版本。有关详细信息,请阅读Row Versioning-based Isolation Levels in the Database Engine

您不应该将行版本控制和快照与脏读取混淆。脏读取提供inconsistent data,这使编程成为一种挑战,至少可以说(即你不应该使用它!)。快照读取始终提供事务一致的数据映像。

答案 1 :(得分:2)

默认情况下,SQL Server使用 READ COMMITTED 隔离级别,这意味着它会在尝试读取之前等待未经修改的更改。

http://msdn.microsoft.com/en-us/library/ms173763.aspx

请注意,如果您不关心所返回数据的准确性,您可以随时将隔离级别设置为 Read Uncommitted 这将为您提供所有记录,这些记录会在具有绑定更改的情况下进行

您还可以使用快照隔离级别,它将为您提供所有记录,包括当前正在修改的最新已知数据版本,当前修改

答案 2 :(得分:1)

锁定策略是基于连接的连接处理的东西 - 这可以由应用程序设置并使用SQL Server本身。

了解更多详情,了解Transaction Isolation Levels