【发布时间】:2014-11-08 03:30:06
【问题描述】:
锁 大家好,我正在研究锁并试图了解它们。
我的目标也是,能够在更新行时锁定行,但仍允许用户从表中读取。 在我的阅读中,我读到了这个
"共享锁 (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
最后一个交易没有运行,我不确定为什么。因为它说我可以读取数据
我还查看了它似乎工作的更新锁,因为除非我提交或回滚事务,否则我无法更新行。但是,我无法选择交易。我唯一可用的选择是使用排他锁并读取未提交吗? 只是寻找锁定正在更新的行的最佳方法,但同时允许读取该行和表。 谢谢你。
【问题讨论】:
-
在您的事务中使用快照隔离级别。
-
显示完整代码。您是否提交并结束交易。你知道单次更新就是交易吗?
-
@Blam 我没有结束交易,我正在开始交易并进入其他会话,并注意当我尝试访问和更新所述行时发生了什么。测试一下
标签: sql-server tsql