在连接到2014 DB的SQLServer 2014 Management Studio中打开2个窗口。SQL Server锁定机制刺激
在第一窗口:
SELECT * FROM categorytypes WHERE id = 12
输出:
ID DESCRIPTION ORDER
---------------------
12 Electronics 20
然后:
begin tran
UPDATE CategoryTypes SET [order] = 20 WHERE id = 12
现在转到其它窗口(Ctrl + N键):
SELECT * FROM CategoryTypes
该查询将无限期执行,直到第一个窗口传输提交或回滚。这很好,因为ID = 12行被锁定。
SELECT * FROM CategoryTypes WHERE ID <> 12
工作正常。
SELECT * FROM CategoryTypes WHERE Description = 'MEN'
这是问题,为什么这个查询应该无限期地执行地狱,我们知道ID = 12的描述“电子”。
在一个大型应用程序中,在同一张表上同时执行巨大的DML过程和选择操作时,这种锁定机制不会允许在不同的记录集上同时执行这两件事。
在Oracle这种用例的作品中,只要锁定(脏行)不是结果集的一部分。
伙计们,有没有什么办法可以避免这种Oracle锁定机制?我不想使用NOLOCK
,或将我的交易设置为READ UNCOMMITTED
。
谢谢。
你有机会在这里了解锁。看看sys.dm_tran_locks,看看你的更新事务处理了什么锁,以及select所要求的锁。您可能想要加入sys.dm_tran_session_transactions以将其关联到session_id。 – 2015-02-07 05:43:17
锁定在行上不起作用。它适用于索引记录。根据您的访问路径,锁可能会碰撞或不碰撞。 – usr 2015-02-07 10:12:29