sql-server - 为什么共享锁允许在 SQL Server 中进行更新?
问题描述
当我们发出一个 select 语句时,它会放置一个共享锁,并且在共享锁期间其他事务无法进行更新。所以我正在尝试执行以下操作,如下面的代码所示。
我已经开始交易,然后延迟 50 秒。我打开其他查询窗口并尝试对同一记录进行更新。我期待更新应该被阻止 50 秒,但它只是执行。是不是在选择共享锁被释放后,我以任何方式进入等待共享模式。
begin tran
select * from tblCustomer where CustomerId=1
WAITFOR DELAY '00:00:50'
commit tran
当我这样做以进行更新时,它可以工作。我的意思是当我将更新放入 begin tran 和 committ tran 并在提交模式下执行 select 时,选择块。
解决方案
您的共享锁在选择执行后立即释放,即使它在事务内部。
如果您打算在选择后更新记录,在这种情况下,您需要获取UPDLOCK
如下锁。
DECLARE @IdToUpdate INT
SELECT @IdToUpdate = ID from tblCustomer WITH (UPDLOCK) where CustomerId=1
UPDATE [tblCustomer]
SET X=Y
WHERE ID=@IdToUpdate
这将提前在记录上获取必要的更新锁,并将停止其他会话以获取记录上的任何锁(共享/独占)
推荐阅读
- amazon-s3 - s3 复制对象将一个文件夹内容复制到另一个
- javascript - 使用 Javascript 更改 TH 中的文本
- java - 如何确定 2 个逻辑驱动器是否在 Java 中的同一个物理磁盘上
- google-cloud-platform - google cloud ml 引擎预测功能如何工作?
- javascript - 是否可以使用 Javascript 从另一个网页更改一个网页?
- java - Spring JPA OneToOne 映射实体在事务测试中行为不正确
- c# - 为什么 ArrayPool 上的分配比 Stack 上的分配更快?
- c# - Asp.net Web 引用 .net 标准 2.0 库引发运行时异常
- html - Ruby on Rails 无法正确显示 CSS 级联优先级
- java - 如何将包含双精度值的字符数组转换为双精度变量,而不产生字符串对象的开销?