sam*_*mol 6 postgresql concurrency deadlock database-deadlocks
我运行多台服务器,每台服务器都在运行多更新语句,例如这些
UPDATE user SET ... WHERE user_id = 2;
UPDATE user SET ... WHERE user_id = 1;
UPDATE user SET ... WHERE user_id = 3;
Run Code Online (Sandbox Code Playgroud)
如果有并发更新,例如:
UPDATE user SET ... WHERE user_id = 1;
UPDATE user SET ... WHERE user_id = 2;
Run Code Online (Sandbox Code Playgroud)
然后我会遇到错误 deadlock detected
现在,我的解决方法是在客户端对更新语句进行排序,并始终保证 id 的顺序相同。即我总是在客户端对语句进行排序ASC by user_id
到目前为止,这似乎解决了这个问题,但我仍然有疑问:
在应用程序级别对语句进行排序是一个很好的解决方案,因为它避免了数据库开销。这些语句需要保留每个表的顺序。如果这在应用程序中很容易实现,那么这是值得的。
数据库层面还有一个解决方案:可序列化隔离。
Serialized 隔离级别提供最严格的事务隔离。该级别模拟所有已提交事务的串行事务执行;就好像事务是一个接一个地连续执行的,而不是同时执行的。但是,与可重复读取级别一样,使用此级别的应用程序必须准备好因序列化失败而重试事务。事实上,此隔离级别的工作方式与可重复读取完全相同,只是它监视可能导致一组并发可串行事务的执行行为与这些事务的所有可能串行(一次一个)执行不一致的条件。
您可以在开始事务时设置此隔离级别。这确实增加了一些数据库开销,但更重要的是应用程序必须准备好捕获序列化失败并重试事务。
归档时间: |
|
查看次数: |
2756 次 |
最近记录: |