大家好,我正在研究锁,并试图理解它们。
我的目标也是,能够锁定正在更新的行,但仍然允许用户从表中读取数据。在我的阅读中我读到了这个
“共享锁(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这最后一次超越没有运行,我也不太清楚为什么。因为上面说我能读到数据
我还查看了更新锁,它似乎工作,因为,我不能更新行,除非我喜剧或回滚的超越。但是,我不能选择事务。我唯一可用的选项是使用独占锁并读取未提交的?只需要寻找锁定正在更新的行的最佳方法,但同时允许读取该行和表。谢谢。
发布于 2014-11-07 19:24:57
这取决于获取资源上的锁的模式。
这里有三种锁定模式。共享(S)、更新(U)和排它(X)。
锁兼容性矩阵如下
+---+----+----+---+
| | S | U | X |
+---+----+----+---+
| S | ✓ | ✓ | ✘ |
| U | ✓ | ✘ | ✘ |
| X | ✘ | ✘ | ✘ |
+---+----+----+---+即,共享与其他共享或更新兼容。更新锁与共享锁兼容,但与其他更新锁和独占锁不兼容。
第一个事务在它上获得一个U锁,然后将它转换为X锁,以实际执行更新。第二个事务由于S锁与X锁不兼容而被阻塞。
在更新时允许读取行的唯一方法是使用read uncommitted或快照隔离级别之一。后者将返回行的“前”值。前者可以返回“脏”数据。即“后”价值,但在其实施之前。
https://stackoverflow.com/questions/26806835
复制相似问题