首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取为更新而锁定的行和表

读取为更新而锁定的行和表
EN

Stack Overflow用户
提问于 2014-11-07 17:32:33
回答 1查看 1.5K关注 0票数 1

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

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

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

所以我把这个放在一笔交易里。

代码语言:javascript
运行
复制
BEGIN TRAN

USE AdventureWorks2008R2

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

现在,在下一个事务中,我有同样的事情

代码语言:javascript
运行
复制
BEGIN TRAN

USE AdventureWorks2008R2



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

--ROLLback

它不会像我预期的那样被执行,但是在另一个事务中,我有

代码语言:javascript
运行
复制
select * from AdventureWorks2008R2.Person.Address

这最后一次超越没有运行,我也不太清楚为什么。因为上面说我能读到数据

我还查看了更新锁,它似乎工作,因为,我不能更新行,除非我喜剧或回滚的超越。但是,我不能选择事务。我唯一可用的选项是使用独占锁并读取未提交的?只需要寻找锁定正在更新的行的最佳方法,但同时允许读取该行和表。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-07 19:24:57

这取决于获取资源上的锁的模式。

这里有三种锁定模式。共享(S)、更新(U)和排它(X)。

锁兼容性矩阵如下

代码语言:javascript
运行
复制
+---+----+----+---+
|   | S  | U  | X |
+---+----+----+---+
| S | ✓  | ✓ | ✘ |
| U | ✓  | ✘ | ✘ |
| X | ✘  | ✘ | ✘ |
+---+----+----+---+

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

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

在更新时允许读取行的唯一方法是使用read uncommitted或快照隔离级别之一。后者将返回行的“前”值。前者可以返回“脏”数据。即“后”价值,但在其实施之前。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26806835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档