繁体   English   中英

读取已锁定的行和表以进行更新

[英]Reading rows and table locked for updating

锁大家好,我正在研究锁并试图理解它们。

我的目标也是,能够在更新时锁定行,但仍允许用户从表中读取。 在我的阅读中我读到了

“共享锁(S)共享锁保留在悲观并发模型下读取的数据上。持有共享锁时,其他事务可以读取但不能修改锁定的数据。”

因此,我只需一笔交易。

BEGIN TRAN

USE AdventureWorks2008R2

UPDATE Person.Address 
SET AddressLine2 = 'Test Address 2'
WHERE AddressId = 5

现在在下一笔交易中,我有同样的事情

BEGIN TRAN

USE AdventureWorks2008R2



UPDATE Person.Address 
SET AddressLine2 = 'gar'
WHERE AddressId = 5

--ROLLback

没有像我期望的那样执行,但是在另一笔交易中

select * from AdventureWorks2008R2.Person.Address

最后的转换不会运行,而且我不确定为什么。 由于它说我可以读取数据

我还查看了似乎有效的更新锁,因为除非我承诺或回滚该转换,否则无法更新该行。 但是,我无法选择交易。 我唯一可用的选择是使用排他锁并读取未提交的内容吗? 只是寻找锁定要更新的行的最佳方法,但同时允许读取该行和表。 谢谢。

这取决于对资源进行锁定的方式。

此处有三种相关的锁定模式。 共享(S),更新(U)和互斥(X)。

锁兼容性矩阵如下

+---+----+----+---+
|   | S  | U  | X |
+---+----+----+---+
| S | ✓  | ✓ | ✘ |
| U | ✓  | ✘ | ✘ |
| X | ✘  | ✘ | ✘ |
+---+----+----+---+

即共享与其他共享或更新兼容。 更新锁与共享锁兼容,但其他更新锁和排他锁不兼容。

第一个事务在其上获得U锁,然后将其转换为X锁以实际执行更新。 第二个事务被阻止,因为S锁与X锁不兼容。

允许在更新时读取行的唯一方法是使用read uncommitted或快照隔离级别之一。 后者将返回该行的“之前”值。 前者可能返回“脏”数据。 即“之后”值但未提交之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM