这是Is it possible to force row level locking in SQL Server?的扩展。这是用例
我的帐户表中有帐号,余额等。许多应用程序都在使用此表。很可能在我修改帐户时,其他人正在修改另一个帐户。所以预期的行为是我会锁定我的帐户(ROW)而另一个用户将锁定他的(另一个ROW)。
但是SQL Server 2008 R2将此锁定升级到页面/表,第二个用户获得超时异常。我已经尝试了所引用问题中提到的所有解决方案,但没有任何工作。
如何强制SQL Server仅锁定行级锁定?或者如何以与页面/表锁定一起使用的方式修改此模型?
修改 此更新通过其PK以单个记录为目标,并且已编入索引,因此只有一行正在更新/锁定,并且该过程不会超过一分钟
修改 现在它看起来很奇怪。我正在为DAL使用ORM库,它打开了多个连接,我已经向他们的支持提出了问题。但是,出于测试目的,我在查询工具上打开了两个会话,并按照
进行了操作Session # 1
begin tran
UPDATE myTable SET COL_1 = COL_1 WHERE COL_1 = 101;
Session # 2
SELECT COL_1 FROM myTable WHERE COL_1 = 101;
Session#2中的查询超时!!!对COL_1
的其他值的查询工作正常。现在看来,如果同一记录在另一个会话中处于编辑模式,则会阻止SELECT。
虽然Oracle确实支持选择一行(使用默认的params / no关键字),而其他会话正在修改它,但是SQL Server没有(使用默认的params / no关键字),所以看起来问题出在库中
答案 0 :(得分:8)
默认情况下,SQL Server始终使用行级锁定....那么你究竟需要什么?
如果您锁定超过一定数量的行(大约5000),则SQL Server将执行lock escalation(分别锁定表而不是超过5000行)以优化性能并优化资源使用 - 但这是好事! : - )
有很多方法可以完全关闭它 - 但是那些不推荐!,因为你在SQL Server的存储引擎中搞乱了一个非常基本的机制。
请参阅:
答案 1 :(得分:2)
假设您的系统是客户端 - 服务器应用程序,其中客户端和服务器通过非常慢的线路(例如蜗牛邮件)连接,并且用户正在很长时间(例如一周)修改他们的记录。然后考虑一下,当你需要锁定行/数据以及何时实际允许更改行/数据等等 - 显然将SQL服务器内部锁定放置几天似乎不再是好主意。
如果您没有情况,当两个用户需要更改相同记录时,您根本不需要在更改数据时进行锁定。当数据库中的记录发生变化时 - 换句话说,当用户提交更改时,您需要在非常短的时间内锁定。 (这是乐观的锁定方案。)当然,如果两个用户更改相同的数据,那么最新的更改将覆盖之前的更改。
如果绝对要求两个用户永远不应该修改相同的数据(悲观锁定),那么最常见的方法是在数据表中使用一些应用程序定义的锁表或特定字段。当一个用户检查某些记录时(开始编辑或类似时),则需要检查,该记录是否已在使用中(已锁定),如果没有,则将此记录标记为已锁定。当然,您需要一些功能来删除过时的锁。
或者在这种情况下使用SQL Server内部特定功能。看这里:sp_getapplock function in MSDN;这样你就不必担心永远锁定的记录等等。