亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PostgreSQL中行鎖的使用

 更新時(shí)間:2025年06月15日 14:50:30   作者:喝醉酒的小白  
PostgreSQL行鎖分為共享鎖和排他鎖,用于控制并發(fā)事務(wù)對(duì)行數(shù)據(jù)的訪問(wèn),共享鎖允許多事務(wù)讀取,排他鎖獨(dú)占訪問(wèn),本文就來(lái)具體介紹一下行鎖,感興趣的可以了解一下

行鎖(Row - level Locks)

在 PostgreSQL 中,行鎖(Row - level Locks)是一種用于控制并發(fā)事務(wù)對(duì)特定行數(shù)據(jù)訪問(wèn)的機(jī)制。

行鎖的類型

  • 共享鎖(ShareLock) :如果事務(wù) A 對(duì)某行加了共享鎖,其他事務(wù)只能對(duì)該行加共享鎖,而不能加排他鎖。適用于讀操作,允許多個(gè)事務(wù)同時(shí)讀取同一行數(shù)據(jù),但防止其他事務(wù)修改或刪除該行。
  • 排他鎖(ExclusiveLock) :如果事務(wù) A 對(duì)某行加了排他鎖,其他事務(wù)無(wú)論想要對(duì)該行進(jìn)行讀還是寫(xiě)操作都無(wú)法加鎖。通常用于寫(xiě)操作,如 UPDATE、DELETE 等,確保在事務(wù)完成對(duì)該行的修改之前,其他事務(wù)無(wú)法對(duì)該行進(jìn)行任何操作。

行鎖的獲取與釋放

  • 獲取 :當(dāng)事務(wù)執(zhí)行涉及到對(duì)某行數(shù)據(jù)的讀寫(xiě)操作時(shí),PostgreSQL 會(huì)自動(dòng)為該行添加相應(yīng)的鎖。例如,執(zhí)行 SELECT…FOR SHARE 或 SELECT…FOR UPDATE 語(yǔ)句時(shí),會(huì)在查詢結(jié)果中的行上添加共享鎖或排他鎖。
  • 釋放 :行鎖會(huì)在事務(wù)結(jié)束時(shí)自動(dòng)釋放,即當(dāng)事務(wù)提交(COMMIT)或回滾(ROLLBACK)時(shí),事務(wù)所持有的所有行鎖都會(huì)被釋放。

行鎖的應(yīng)用場(chǎng)景

  • 數(shù)據(jù)更新與刪除操作 :在執(zhí)行 UPDATE 或 DELETE 操作時(shí),PostgreSQL 會(huì)對(duì)要更新或刪除的行自動(dòng)加排他鎖,防止其他事務(wù)同時(shí)對(duì)這些行進(jìn)行修改或刪除操作,保證數(shù)據(jù)的一致性。
  • 防止幻讀控制 :在可重復(fù)讀隔離級(jí)別下,為避免幻讀現(xiàn)象,事務(wù)在讀取某行數(shù)據(jù)時(shí)會(huì)為其加共享鎖,這樣其他事務(wù)就不能對(duì)同一行數(shù)據(jù)進(jìn)行插入、更新或刪除操作。

查看行鎖

可以通過(guò)查詢 pg_locks 系統(tǒng)表來(lái)查看當(dāng)前數(shù)據(jù)庫(kù)中行鎖的情況,例如:

SELECT * FROM pg_locks WHERE locktype = 'tuple';

需要注意的是,行鎖雖然可以有效控制并發(fā)事務(wù)對(duì)行數(shù)據(jù)的訪問(wèn),但在高并發(fā)場(chǎng)景下,過(guò)多的行鎖可能會(huì)導(dǎo)致事務(wù)等待甚至死鎖。因此,在設(shè)計(jì)數(shù)據(jù)庫(kù)應(yīng)用時(shí),要合理控制事務(wù)的粒度和操作,盡量避免長(zhǎng)時(shí)間持有行鎖,以提高系統(tǒng)的并發(fā)性能。

PostgreSQL行鎖機(jī)制詳解

在這里插入圖片描述

一、行鎖實(shí)現(xiàn)原理

PostgreSQL的行鎖通過(guò)元組(tuple)頭部信息實(shí)現(xiàn),采用多版本并發(fā)控制(MVCC)機(jī)制。與Oracle的ITL槽位和MySQL的bitmap方式不同,其特點(diǎn)包括:

  • 元組x m a x xmaxxmax字段記錄事務(wù)ID和鎖標(biāo)記位
  • 共享鎖(FOR SHARE)通過(guò)設(shè)置HEAP_XMAX_SHR_LOCK標(biāo)記
  • 排他鎖(FOR UPDATE)通過(guò)設(shè)置HEAP_XMAX_EXCL_LOCK標(biāo)記
  • 鎖信息不單獨(dú)存儲(chǔ),直接附加在數(shù)據(jù)行上

二、使用方法

-- 排他鎖(寫(xiě)鎖)
BEGIN;
SELECT * FROM table WHERE id = 1 FOR UPDATE;
-- 執(zhí)行更新操作
COMMIT;

-- 共享鎖(讀鎖)
BEGIN;
SELECT * FROM table WHERE id = 1 FOR SHARE;
-- 允許其他事務(wù)加共享鎖
COMMIT;

-- 非阻塞鎖
SELECT * FROM table WHERE id = 1 FOR UPDATE NOWAIT;

-- 跳過(guò)已鎖定行
SELECT * FROM table WHERE status = 'pending' FOR UPDATE SKIP LOCKED;

三、常見(jiàn)問(wèn)題及解決方案

鎖沖突

  • 現(xiàn)象:事務(wù)長(zhǎng)時(shí)間等待
  • 排查方法:
SELECT pid, relation::regclass, locktype, mode 
FROM pg_locks 
WHERE relation = 'table_name'::regclass;

死鎖檢測(cè)

  • 自動(dòng)檢測(cè):PostgreSQL默認(rèn)開(kāi)啟死鎖檢測(cè)(deadlock_timeout=1s)
  • 手動(dòng)排查:
SELECT * FROM pg_stat_activity 
WHERE wait_event_type = 'Lock';

鎖升級(jí)問(wèn)題

  • PostgreSQL行鎖不會(huì)升級(jí)為表鎖,與MySQL不同
  • 注意表級(jí)鎖與行鎖的共存規(guī)則

長(zhǎng)時(shí)間鎖持有

優(yōu)化建議:

SET lock_timeout = '3s';
  • 縮短事務(wù)時(shí)間
  • 使用NOWAITSKIP LOCKED
  • 設(shè)置合理的鎖超時(shí)時(shí)間

四、優(yōu)化建議

優(yōu)先使用READ COMMITTED隔離級(jí)別

利用隱藏的樂(lè)觀鎖版本字段實(shí)現(xiàn)無(wú)鎖并發(fā)控制

監(jiān)控工具組合:

-- 實(shí)時(shí)鎖監(jiān)控視圖
SELECT * FROM pg_stat_activity 
JOIN pg_locks ON pg_stat_activity.pid = pg_locks.pid;

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

相關(guān)文章

  • postgresql 中的參數(shù)查看和修改方式

    postgresql 中的參數(shù)查看和修改方式

    這篇文章主要介紹了postgresql 中的參數(shù)查看和修改方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • pgsql查詢優(yōu)化之模糊查詢實(shí)例詳解

    pgsql查詢優(yōu)化之模糊查詢實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于pgsql查詢優(yōu)化之模糊查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pgsql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • PostgreSQL進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作代碼

    PostgreSQL進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作代碼

    在數(shù)據(jù)庫(kù)管理中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是非常常見(jiàn)的操作,特別是在 PostgreSQL 中,提供了多種工具和方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的有效管理,本文將詳細(xì)介紹在 PostgreSQL 中如何進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出,并給出具體的命令及示例,需要的朋友可以參考下
    2024-10-10
  • PostgreSQL數(shù)據(jù)庫(kù)中Sequence的使用方法詳解

    PostgreSQL數(shù)據(jù)庫(kù)中Sequence的使用方法詳解

    在 PostgreSQL 數(shù)據(jù)庫(kù)中,Sequence 是一種特殊的表對(duì)象,主要用于生成按順序遞增或遞減的數(shù)字序列,通常用于需要唯一標(biāo)識(shí)符的場(chǎng)景,例如自增 ID,以下是如何在 PostgreSQL 中使用 Sequence 的詳細(xì)步驟,需要的朋友可以參考下
    2024-11-11
  • postgresql 實(shí)現(xiàn)sql多行語(yǔ)句合并一行

    postgresql 實(shí)現(xiàn)sql多行語(yǔ)句合并一行

    這篇文章主要介紹了postgresql 實(shí)現(xiàn)sql多行語(yǔ)句合并一行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL 修改表字段常用命令操作

    PostgreSQL 修改表字段常用命令操作

    這篇文章主要介紹了PostgreSQL 修改表字段常用命令操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL去掉表中所有不可見(jiàn)字符的操作

    PostgreSQL去掉表中所有不可見(jiàn)字符的操作

    這篇文章主要介紹了PostgreSQL去掉表中所有不可見(jiàn)字符的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL中Slony-I同步復(fù)制部署教程

    PostgreSQL中Slony-I同步復(fù)制部署教程

    這篇文章主要給大家介紹了關(guān)于PostgreSQL中Slony-I同步復(fù)制部署的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • DBeaver中PostgreSQL數(shù)據(jù)庫(kù)顯示不全的解決方法

    DBeaver中PostgreSQL數(shù)據(jù)庫(kù)顯示不全的解決方法

    最近,在DBeaver中連接了本地的PostgreSQL數(shù)據(jù)庫(kù),但是連接后打開(kāi)這個(gè)數(shù)據(jù)庫(kù)時(shí)發(fā)現(xiàn),數(shù)據(jù)庫(kù)顯示不全,所以本文給大家介紹了DBeaver中PostgreSQL數(shù)據(jù)庫(kù)顯示不全的解決方法,需要的朋友可以參考下
    2024-11-11
  • Postgresql 實(shí)現(xiàn)查詢一個(gè)表/所有表的所有列名

    Postgresql 實(shí)現(xiàn)查詢一個(gè)表/所有表的所有列名

    這篇文章主要介紹了Postgresql 實(shí)現(xiàn)查詢一個(gè)表/所有表的所有列名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論