最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL死鎖了怎么辦及處理方法

 更新時間:2023年01月13日 11:17:03   作者:慕楓技術(shù)筆記  
這篇文章主要介紹了PostgreSQL死鎖了怎么辦?本文給大家講解了死鎖原因及解決方法,介紹l避免死鎖的實戰(zhàn)建議,本文給大家介紹的非常詳細,需要的朋友可以參考下

什么是數(shù)據(jù)庫死鎖

在操作系統(tǒng)領(lǐng)域當中,死鎖指的是兩個或者兩個以上的進程在運行的過程中,因為爭奪共同的訪問資源而相互等待阻塞,最終造成阻礙進程繼續(xù)執(zhí)行的一種阻塞現(xiàn)象。那么在數(shù)據(jù)庫領(lǐng)域當中死鎖又是怎樣的表現(xiàn)形式呢?

如下圖所示,假設(shè)事務(wù)A持有行1的共享鎖,事務(wù)B持有行2的共享鎖,那么此時事務(wù)A請求持有行2的排他鎖,那么在事務(wù)B釋放資源之前都處于阻塞等待的狀態(tài),同樣的事務(wù)B請求持有行1的排他鎖,在事務(wù)A 釋放資源之前同樣也是處于阻塞等待的狀態(tài)。也就是說事務(wù) B 完成之后事務(wù) A 才能完成,而事務(wù)A的完成又依賴于事務(wù)B的完成,這就形成了循環(huán)依賴的問題,最終導(dǎo)致死鎖情況的發(fā)生。

如何確定死鎖位置

//先確定數(shù)據(jù)庫有沒有死鎖情況發(fā)生
select * from pg_stat_activity where datname = 'product_db';

//查詢可能鎖了的表的oid
select oid from pg_class where relname='product';

//查詢對應(yīng)的pid
select pid from pg_locks where relation='oid'  //上面查詢出來的oid

//取消或者終止對應(yīng)的進程
select pg_cancel_backend(pid);
select pg_terminate_backend(pid);

死鎖的可能原因以及解決辦法

以上分析了PostgreSQL出現(xiàn)死鎖后如何定位分析,那么接下來就需要總結(jié)分析分析下數(shù)據(jù)庫出現(xiàn)死鎖情況的原因以及一般的應(yīng)對解決辦法。

1、索引使用問題導(dǎo)致的死鎖問題

索引使用存在問題的話會導(dǎo)致死鎖問題,假設(shè)在一個數(shù)據(jù)查詢的事務(wù)當中,進行數(shù)據(jù)檢索的時候沒辦法按照SQL中的where條件進行查詢,因此導(dǎo)致了全表掃描,那么此時數(shù)據(jù)庫表的行級鎖會上升為表級鎖。如果此時有多個未能按照where條件進行數(shù)據(jù)查詢的事務(wù)存在,那么就容易導(dǎo)致數(shù)據(jù)庫死鎖問題。也就是說在數(shù)據(jù)庫表數(shù)據(jù)量比較大的時候,對應(yīng)進行數(shù)據(jù)查詢的表沒有建立索引或者說索引創(chuàng)建的不合理導(dǎo)致無法通過索引進行數(shù)據(jù)查詢,只能通過全表索引,這樣的場景下就容易產(chǎn)生死鎖。

如何避免:
在進行數(shù)據(jù)查詢的時候,對應(yīng)的SQL語句不宜太過復(fù)雜,也就是說盡量避免多張表的關(guān)聯(lián)查詢。

2、不同事務(wù)之間的訪問順序問題

當用戶A 訪問數(shù)據(jù)庫表A時,此時對表A加了共享鎖,然后又訪問數(shù)據(jù)庫表B。而此時另一個用戶B 訪問表B,對表B加了共享鎖,然后試圖訪問表A。但是用戶A由于用戶B已經(jīng)鎖住表B,它必須等待用戶B釋放表B才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù),也就是說互相等待對方釋放資源,從而導(dǎo)致了死鎖的發(fā)生。

如何避免:
這種情況在實際項目中遇到的可能比較多,主要還是需要通過控制代碼的執(zhí)行邏輯,避免多表操作時同時鎖住多個資源。

避免死鎖的實戰(zhàn)建議

(1)如果平臺中存在大事務(wù),盡量將其拆分為小事務(wù)。因為大事務(wù)一般操作的數(shù)據(jù)庫表或者數(shù)據(jù)都比較多,因此造成死鎖或者阻塞的概率就會相對較大。

(2)為數(shù)據(jù)庫表設(shè)計合理的索引,盡量避免數(shù)據(jù)查詢時索引未覆蓋或者索引失效的情況,因為全表掃描會會導(dǎo)致給表中的數(shù)據(jù)行上鎖,大大增加了數(shù)據(jù)庫產(chǎn)生死鎖的概率。

(3)如果業(yè)務(wù)允許,我們可以嘗試將隔離級別調(diào)低,比如將隔離級別從RR調(diào)整為RC,可以避免掉很多因為gap鎖造成的死鎖。

補充:下面在看下Postgresql死鎖的處理

背景:

對表進行所有操作都卡住,原因可能是更新表時導(dǎo)致這個表死鎖了,開始進行排查

解決一:查詢pg_stat_activity有沒有記錄

pg版本10.2

select pid,query,* from pg_stat_activity where datname='死鎖的數(shù)據(jù)庫' and wait_event_type = 'Lock';
select pg_cancel_backend('死鎖那條數(shù)據(jù)的pid值');##只能殺死select 語句, 對其他語句不生效
pg_terminate_backend('死鎖那條數(shù)據(jù)的pid值');#select,drop等各種操作

執(zhí)行后發(fā)現(xiàn)select和delete表時正常執(zhí)行,但truncate和drop表時會一直運行,也不報錯。

“drop table” 和 “truncate table” 需要申請排它鎖"ACCESS EXCLUSIVE", 執(zhí)行這個命令卡住時,說明此時這張表上還有操作正在進行,比如查詢等,

那么只有等待這個查詢操作完成,“drop table” 或"truncate table"或者增加字段的SQL才能獲取這張表上的 "ACCESS EXCLUSIVE"鎖,操作才能進行下去。

解決二:查詢pg_locks是否有這個對象的鎖

select oid,relname from pg_class where relname='table name';
select locktype,pid,relation,mode,granted,* from pg_locks where relation= '上面查詢出來的oid';
select pg_terminate_backend('進程ID');

問題解決?。?!

坑:一開始不知道pg_cancel_backend(‘死鎖那條數(shù)據(jù)的pid值');##只能殺死select 語句, 對其他語句不生效,殺了進程查詢發(fā)現(xiàn)還存在,反復(fù)殺反復(fù)存在,換了pg_terminate_backend(‘進程ID')問題就解決了。

PS:postgresql表死鎖問題的排查方式

1.查詢激活的執(zhí)行中的sql,查看有哪些更新update的sql。

select *
from pg_stat_activity
where state = 'active';

2. 查詢表中存在的鎖

select a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'h5_game';

3. 殺掉死鎖進程

select pg_terminate_backend(pid)
from pg_stat_activity
where state = 'active'
and pid != pg_backend_pid()
--and pid = 14172
and pid in (select a.pid
from pg_locks a
join pg_class b on a.relation = b.oid
where lower(b.relname) = 'news_content')

鎖模式

/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */
#define NoLock                 0
 
#define AccessShareLock         1        /* SELECT */
#define RowShareLock          2        /* SELECT FOR UPDATE/FOR SHARE */
#define RowExclusiveLock        3        /* INSERT, UPDATE, DELETE */
#define ShareUpdateExclusiveLock 4       /* VACUUM (non-FULL),ANALYZE, CREATE
                                         * INDEX CONCURRENTLY */
#define ShareLock                5        /* CREATE INDEX (WITHOUT CONCURRENTLY) */
#define ShareRowExclusiveLock  6        /* like EXCLUSIVE MODE, but allows ROW
                                         * SHARE */
#define ExclusiveLock          7        /* blocks ROW SHARE/SELECT...FOR
                                         * UPDATE */
#define AccessExclusiveLock       8        /* ALTER TABLE, DROP TABLE, VACUUM
                                         * FULL, and unqualified LOCK TABLE */

到此這篇關(guān)于PostgreSQL死鎖了怎么辦?的文章就介紹到這了,更多相關(guān)PostgreSQL死鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • postgresql varchar字段regexp_replace正則替換操作

    postgresql varchar字段regexp_replace正則替換操作

    這篇文章主要介紹了postgresql varchar字段regexp_replace正則替換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 基于postgresql行級鎖for update測試

    基于postgresql行級鎖for update測試

    這篇文章主要介紹了基于postgresql行級鎖for update測試,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL 自增語法的用法說明

    PostgreSQL 自增語法的用法說明

    這篇文章主要介紹了PostgreSQL 自增語法的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgresql踩坑系列之關(guān)于to_date()問題

    postgresql踩坑系列之關(guān)于to_date()問題

    這篇文章主要介紹了postgresql踩坑系列之關(guān)于to_date()問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • PostgreSQL如何查詢表結(jié)構(gòu)和索引信息

    PostgreSQL如何查詢表結(jié)構(gòu)和索引信息

    文章介紹了在PostgreSQL中查詢表結(jié)構(gòu)和索引信息的幾種方法,包括使用`\d`元命令、系統(tǒng)數(shù)據(jù)字典查詢以及使用可視化工具DBeaver
    2024-12-12
  • Postgresql中json和jsonb類型區(qū)別解析

    Postgresql中json和jsonb類型區(qū)別解析

    在我們的業(yè)務(wù)開發(fā)中,可能會因為特殊【歷史,偷懶,防止表連接】經(jīng)常會有JSON或者JSONArray類的數(shù)據(jù)存儲到某列中,這個時候再PG數(shù)據(jù)庫中有兩種數(shù)據(jù)格式可以直接一對多或者一對一的映射對象,接下來通過本文介紹Postgresql中json和jsonb類型區(qū)別,需要的朋友可以參考下
    2024-06-06
  • PostgreSQL向數(shù)據(jù)庫表中添加行數(shù)據(jù)的操作

    PostgreSQL向數(shù)據(jù)庫表中添加行數(shù)據(jù)的操作

    這篇文章主要介紹了PostgreSQL向數(shù)據(jù)庫表中添加行數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL中的psql命令詳解

    PostgreSQL中的psql命令詳解

    psql是PostgreSQL的一個命令行交互式客戶端工具,它具有非常豐富的功能,類似于Oracle的命令行工具sqlplus,這篇文章主要介紹了PostgreSQL-psql命令詳解,需要的朋友可以參考下
    2023-07-07
  • PostgreSQL使用jsonb進行數(shù)組增刪改查的操作詳解

    PostgreSQL使用jsonb進行數(shù)組增刪改查的操作詳解

    有時候我們需要使用PostgreSQL這種結(jié)構(gòu)化數(shù)據(jù)庫來存儲一些非結(jié)構(gòu)化數(shù)據(jù),PostgreSQL恰好又提供了json這種數(shù)據(jù)類型,這里我們來簡單介紹使用jsonb的一些常見操作,需要的朋友可以參考下
    2024-03-03
  • PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用

    PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用

    這PostgreSQL中提供了窗口函數(shù),一個窗口函數(shù)在一系列與當前行有某種關(guān)聯(lián)的表行上進行一種計算。下面這篇文章主要給大家介紹了關(guān)于PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用的相關(guān)資料,需要的朋友可以參考下
    2019-03-03

最新評論

麦盖提县| 凤庆县| 方山县| 东阳市| 搜索| 盖州市| 温州市| 交城县| 锡林郭勒盟| 惠东县| 盈江县| 新兴县| 荔波县| 福建省| 清河县| 渝北区| 合山市| 沙坪坝区| 永仁县| 铅山县| 云林县| 怀安县| 监利县| 青州市| 哈巴河县| 鄯善县| 金华市| 永寿县| 尚志市| 巧家县| 扎赉特旗| 沙坪坝区| 房山区| 永安市| 乐陵市| 甘南县| 文登市| 兴和县| 沂水县| 沙坪坝区| 抚宁县|