gpt4 book ai didi

multithreading - 如何避免更新死锁

转载 作者:行者123 更新时间:2023-11-29 11:19:17 26 4
gpt4 key购买 nike

在使用 Postgres 处理 JDBC 时...

Isolationlevel="Read committed"

当我尝试在一些操作后更新表时,我在多线程环境中遇到了同样的死锁。所以我尝试使用多个查询,如下所示

  ps = con.prepareStatement("UPDATE TableA SET column1=column1-? WHERE column2=? and column3=?;"  
+ "UPDATE TableA SET column1=column1+? WHERE column2=? and column3=?;");

这是错误的 postgresql 日志

2016-12-19 12:25:44 IST STATEMENT:  UPDATE TableA SET column1=column1+$1 WHERE column2=$2 and column3=$3
2016-12-19 12:25:44 IST FATAL: connection to client lost
2016-12-19 12:25:45 IST ERROR: deadlock detected
2016-12-19 12:25:45 IST DETAIL: Process 8524 waits for ShareLock on transaction 84942; blocked by process 12520.
Process 12520 waits for ShareLock on transaction 84940; blocked by process 20892.
Process 20892 waits for ExclusiveLock on tuple (1,5) of relation 25911 of database 24736; blocked by process 8524.
Process 8524: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3
Process 12520: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3
Process 20892: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3
2016-12-19 12:25:45 IST HINT: See server log for query details.
2016-12-19 12:25:45 IST CONTEXT: while locking tuple (1,12) in relation "TableA"
2016-12-19 12:25:45 IST STATEMENT: UPDATE TableA SET column1=column1-$1 WHERE column2=$2 and column3=$3
2016-12-19 12:25:45 IST LOG: could not send data to client: No connection could be made because the target machine actively refused it.

在这个多线程环境中,我希望 TableA 的行为 2 个语句锁定并避免死锁。

我看到类似的场景在 Postgres Docs

我找不到任何方法来避免这种死锁。任何帮助表示赞赏。谢谢

P.S: Autocommit 已经设置为 FALSE,并尝试将 preparedStatements 与单个 UPDATE 查询一起使用。

关于多个查询 -> Multiple queries in one Preparedstatementthis表明 postgres 不需要任何额外的配置。

最佳答案

正如@Nick Barnes 在我分享的链接的评论中引用的那样。

The best defense against deadlocks is generally to avoid them by being certain that all applications using a database acquire locks on multiple objects in a consistent order.

特别是对于提到的更新死锁,更新的顺序会导致死锁。

示例:

UPDATE Table SET ... WHERE id= 1;
UPDATE Table SET ... WHERE id= 2;

UPDATE Table SET ... WHERE id= 2;
UPDATE Table SET ... WHERE id= 1;

一般的解决方案是根据 id 排序更新。这就是一致顺序的意思。

直到我与这个僵局作斗争,我才明白这一点。

关于multithreading - 如何避免更新死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219102/

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