我使用PostgreSQL 9.2,並且我沒有使用任何地方的明確鎖定,既不LOCK
聲明也SELECT ... FOR UPDATE
。不過,最近我得到了ERROR: 40P01: deadlock detected
。儘管檢測到死鎖的查詢被封裝在事務塊中。無論如何,它是如何來的?postgres死鎖沒有明確鎖定
回答
您不需要任何明確的LOCK
進入死鎖。這裏是一個從無到有的非常簡單的演示,只有INSERT語句:
create table a(i int primary key);
create table b(i int primary key);
活動#1的作用:
begin;
insert into a values(1);
然後會話#2的作用:
begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction
然後會話#1的作用:
insert into b values(1);
然後死鎖oc curs:
ERROR: deadlock detected
DETAIL: Process 9571 waits for ShareLock on transaction 4150; blocked by process 9501.
Process 9501 waits for ShareLock on transaction 4149; blocked by process 9571.
HINT: See server log for query details.
簡單的UPDATE或UPDATE和INSERT的組合也可能發生同樣的情況。 這些操作採取隱式鎖定,如果它們以不同順序發生在不同會話中,則它們可能會死鎖。
我會首先懷疑散列索引。
- 開關任何
hash
-Indexes你必須B-tree
- 使用
Serializable
隔離級別,如果它似乎是適當的。
我沒有任何散列索引,反正他們怎麼會是這個原因? – zapadlo
作爲其實現的一部分,可以使用[hash-bucket-level鎖用於讀/寫訪問](http://www.postgresql.org/docs/9.2/static/locking-indexes.html)。 –
- 1. Postgres死鎖
- 2. CircleC上的Postgres死鎖
- 3. 確定死鎖的原因
- 4. 死鎖沒有到達keyPressedEvent()
- 5. 沒有循環的死鎖
- 6. Postgresql鎖死鎖
- 7. postgres中的鎖定機制/ postgres中的死鎖。 [我正在使用sqlalchemy]
- 8. 明顯死鎖c3p0問題
- 9. 鎖分區死鎖
- 10. 死鎖鎖()方法
- 11. 死鎖
- 12. 如果我們證明沒有飢餓,我們不需要證明沒有死鎖或活鎖(進展)?
- 13. 如何在Postgres中通知死鎖
- 14. Django LiveServerTestCase,Selenium和Postgres間歇性死鎖
- 15. TAO在鎖定時發生死鎖
- 16. 使用Thread.Sleep解決鎖定死鎖
- 17. Python線程和鎖定:死鎖
- 18. 如何確保鎖定順序以避免死鎖?
- 19. emacs:有沒有多行字體鎖定的明確例子?
- 20. ReentrantLock.tryLock()沒有鎖定
- 21. 死鎖在MCS鎖實施
- 22. 帶鎖的死鎖工作
- 23. 避免螺旋鎖死鎖
- 24. SQL Server 2008:發生死鎖...沒有任何鎖
- 25. 爲什麼TABLOCKX沒有死鎖
- 26. 這段代碼怎麼沒有死鎖?
- 27. 死鎖沒有用戶代碼
- 28. 鎖(objectReference){}沒有鎖定關鍵部分
- 29. 鎖定專用鎖對象導致死鎖
- 30. 獲取對兩個互斥鎖的鎖定並避免死鎖
你可以顯示減少查詢/架構你的死鎖發生的地方?你的交易中是否使用了散列索引? –