gpt4 book ai didi

sql - 简单的 UPDATE 和 DELETE 语句可以触发 PostgreSQL 中的死锁和回滚吗?

转载 作者:行者123 更新时间:2023-11-29 13:31:13 25 4
gpt4 key购买 nike

当在同一表上同时执行其他更复杂的语句时,在触发器中执行的简单 UPDATEDELETE 语句是否会导致死锁或回滚?

UPDATE "s_mat"
SET "req_st" = my_st, "l_upd" = retr
WHERE "req_id" = my_id;

DELETE FROM "mat" WHERE "req_id" = my_id;

我是否应该预测这些语句的潜在 deadlock_detectedtransaction_rollback 异常?

最佳答案

基本上是的。如果两个触发器同时在两个单独的事务中运行,我们称它们为 t1 和 t2:

t1                t2
update row x
update row y
delete row y
delete row x

这会陷入僵局。 Postgres 自动检测条件并中止除一个竞争事务之外的所有事务。 Details in the manual.

如果您的所有代码都以相同(确定性)顺序 处理行,则不会发生这种情况。但有时不能保证这一点。

如果锁定所有要处理的行manually使用独占锁(按规范顺序),您可以显着减少死锁的机会。

要绝对确定,请使用 SERIALIZABLE 运行事务隔离。您必须为序列化失败准备代码,并在这种情况下重试。

可序列化模式下的事务较慢,只应在必要时使用。如果您没有面临繁重的并发负载,或者您的代码中没有关键的语句组合,您可能就可以使用默认值(更快)READ COMMITTED隔离级别。

优化代码的性能并最​​大限度地减少竞争条件的机会窗口可以很长。除了始终以相同顺序处理行外,您还可以使用 data-modifying CTEsUPDATEDELETE 结合在一条语句中。不排除竞争条件,但最大限度地减少死锁的时间范围。详细信息示例:

关于sql - 简单的 UPDATE 和 DELETE 语句可以触发 PostgreSQL 中的死锁和回滚吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22719231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com