两个并发但相同的DELETE语句会导致死锁吗?

bil

假设some_table有两行,主键12以下语句序列可能导致死锁:

session 1: begin;
session 2: begin;
session 1: DELETE FROM my_table WHERE my_key = 1;
session 2: DELETE FROM my_table WHERE my_key = 2;
session 1: DELETE FROM my_table WHERE my_key = 2;
session 2: DELETE FROM my_table WHERE my_key = 1;

如果两个会话以相同顺序删除,则不会发生死锁。

现在,我的问题是,如果DELETE语句接触多行会怎样?例如:

session 1: begin;
session 2: begin;
session 1: DELETE FROM my_table;
session 2: DELETE FROM my_table;

两个并发但相同的DELETE语句是否可能会以不同顺序删除行?是否可以强制执行删除命令以避免死锁?

我在文档中找不到此信息,所以我说不能保证删除顺序(尽管它可能间接地作为实现细节)。我想在这里再次检查。

劳伦兹·阿尔伯

是的,这可能导致死锁,因为表中行的顺序不是固定的。

AnyUPDATE可能会更改顺序表扫描返回的行的顺序,并且如果synchronize_seqscans为默认值on,即使同时执行多个顺序扫描,表也可能会更改顺序(如您的情况)。

您应该首先运行SELECT ... FOR UPDATEwithORDER BY子句以减少出现死锁的风险,但是即使如此,您也不能绝对确定,除非您按不会同时更新的列排序(例如主键)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么以不同顺序解锁两个锁定的银行帐户会导致死锁?

在同一互斥锁上使用两个std :: unique_lock会导致死锁?

此“同步”代码会导致死锁吗?

cpp线程连接,如果两个线程相互依赖,则应使用join导致死锁

重用Go通道会导致死锁

如果应用实例在执行事务时崩溃会导致死锁吗?

for循环导致死锁

丢弃过滤的统计信息会导致死锁

在systemd服务内部启动systemd服务会导致死锁

任务异步调用不返回会导致死锁

Oracle 表上的共享索引是否会导致死锁?

此代码不应该导致死锁吗?

全面的乐观并发还是导致死锁的表并发?

异步等待导致死锁

两个按钮导致相同的活动

为什么相同的代码会导致两个不同的图表?

将看似相同的数组写入两个图像文件会导致不同的结果

在Firebird脚本中创建表会导致死锁导致“元数据更新失败”

锁表会导致InnoDB死锁吗?

两个具有相同IP的虚拟机会导致我ping通自己吗

为什么在Golang中发送大于缓冲通道大小的值会导致死锁错误?

为什么在同一goroutine中使用未缓冲的通道会导致死锁?

锁定C ++ 11 std :: unique_lock会导致死锁异常

为什么在Windows Service中阻止异步会导致死锁?

为什么重新使用条件变量的互斥锁会导致死锁?

这两个 SQLite 查询会产生相同的结果吗?

在两个终端中运行相同的python代码,它们会互相干扰吗?

这两个查询会产生相同的结果吗(使用窗口函数与分组依据)

Java:多线程同步,导致死锁