死鎖報(bào)錯(cuò)1
UPDATE deadlock_example SET value = value + 1 WHERE id = 1
ERROR: deadlock detected
DETAIL: Process 95 waits for ShareLock on transaction 3553457; blocked by process 187.
Process 187 waits for ShareLock on transaction 3553458; blocked by process 95.
HINT: See server log for query details.
CONTEXT: while updating tuple (0,6) in relation “deadlock_example”
其中 Process 95 在等待共享鎖(ShareLock)的事務(wù) 3553457,而 Process 187 在等待共享鎖的事務(wù) 3553458。這兩個(gè)事務(wù)相互阻塞,形成了死鎖。
具體解釋如下:
Process 95 正在等待事務(wù)號(hào)為 3553457 的共享鎖,但被 Process 187 阻塞。
Process 187 正在等待事務(wù)號(hào)為 3553458 的共享鎖,但被 Process 95 阻塞。
這種相互等待的情況導(dǎo)致了死鎖。在這種情況下,PostgreSQL 選擇其中一個(gè)事務(wù)(在這里是 Process 95)作為死鎖犧牲者,回滾該事務(wù)以解除死鎖。
死鎖報(bào)錯(cuò)2
UPDATE deadlock_example SET value = value + 1 WHERE id = 1
ERROR: current transaction is aborted, commands ignored until end of transaction block
這個(gè)錯(cuò)誤消息表明在事務(wù)中發(fā)生了一個(gè)錯(cuò)誤,導(dǎo)致整個(gè)事務(wù)被中止。在 PostgreSQL 中,一旦事務(wù)發(fā)生錯(cuò)誤,該事務(wù)就會(huì)被中止,后續(xù)的命令將被忽略,直到事務(wù)塊結(jié)束。
查看數(shù)據(jù)庫(kù)表信息:
SELECT pid, datname, usename, query, state
FROM pg_stat_activity
-
state
為idle in transaction (aborted)
,表示連接處于事務(wù)中空閑狀態(tài),并且事務(wù)已中止(aborted)。
這種狀態(tài)通常表示連接在事務(wù)中執(zhí)行了某些操作,但由于某些原因,該事務(wù)已經(jīng)中止。在這個(gè)特定的情況下,連接正在執(zhí)行一個(gè) UPDATE
查詢,但由于死鎖等原因,事務(wù)中止了。
解決辦法
使用 PostgreSQL 中的 pg_terminate_backend 函數(shù)可以終止指定的連接。
在 pg_stat_activity 表中查找要終止的連接的進(jìn)程ID (pid)。在我的情況中,pid 為 95 的連接發(fā)生了死鎖,所以你可以選擇終止該連接。
執(zhí)行如下命令:
SELECT pg_terminate_backend(95);
返回結(jié)果為 t
,表示執(zhí)行成功。文章來源:http://www.zghlxwxcb.cn/news/detail-809459.html
SELECT pg_terminate_backend(187);
再次查看pg_stat_activity信息,pid為95的進(jìn)程已經(jīng)不見了
。
再次執(zhí)行剛才報(bào)錯(cuò)的sql,發(fā)現(xiàn)可以成功執(zhí)行了。文章來源地址http://www.zghlxwxcb.cn/news/detail-809459.html
到了這里,關(guān)于Postgresql數(shù)據(jù)庫(kù)死鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!