我有一个表格,我需要在其中选择一些行,然后再更新。现在在选择行和更新它之间我不想允许另一个会话更新数据,所以我在这种情况下使用可重复读取。 但是我开始陷入困境。现在为了避免死锁,我正在考虑添加锁定提示 - UPDLOCK,如下所述。
-------------session 1-----------
set transaction isolation level repeatable read
begin transaction
Select new_site_id from abc with (updlock)
update abc set active_site_status = ? where new_site_id = ?
commit transaction
现在UPDLOCK提示与另一个UPDLOCK或更新语句不兼容。但它与共享锁兼容。因此,当另一个会话执行下面提到的代码时,此解决方案失败 -
-------------session 2-----------
set transaction isolation level repeatable read
begin transaction
Select new_site_id from abc --This is without updlock
update abc set active_site_status = ? where new_site_id = ?
commit transaction
在这种情况下如何避免死锁?我在这里有什么选择.. 快照隔离会有帮助吗?如果有一种情况,我开始 - > “设置事务隔离级别快照”和会话2以“设置事务隔离级别可重复读取”开始,仍然会出现死锁或阻塞。我很困惑。
答案 0 :(得分:0)
假设您的情况并不比示例复杂,您可以尝试这样做是一个声明......
UPDATE abc SET active_site_status = ? WHERE new_site_id = (SELECT new_site_id FROM abc)
如果您的案例更复杂,请发布实际代码。