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

深入理解PostgreSQL 事務處理

 更新時間:2025年06月16日 09:37:26   作者:熊大如如  
PostgreSQL事務處理確保數(shù)據(jù)一致性,支持四種隔離級別,處理臟讀、不可重復讀和幻讀問題,并可通過會話或配置文件設置,自動提交默認開啟,感興趣的可以了解一下

簡介

PostgreSQL 事務處理(Transaction Processing)是指在數(shù)據(jù)庫中執(zhí)行一系列 SQL 語句,使其成為一個不可分割的操作單元,即 要么全部執(zhí)行成功,要么全部回滾,以確保數(shù)據(jù)的一致性和完整性

準備工作

  • 創(chuàng)建演示表
CREATE TABLE "public"."users" (
  "user_account" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
  "username" varchar(32) COLLATE "pg_catalog"."default",
  "user_avatar" varchar(64) COLLATE "pg_catalog"."default",
  "user_profile" varchar(512) COLLATE "pg_catalog"."default",
  "hashed_password" varchar COLLATE "pg_catalog"."default" NOT NULL
);

基本操作

  • 提交事務
BEGIN; -- 開啟事務

-- SQL 語句
INSERT INTO users (user_account, hashed_password) VALUES ('Alice', 'xxxx');

COMMIT; -- 提交事務
  • 回滾事務
BEGIN

DELETE FROM users;

ROLLBACK;
  • 設置回滾點

SAVEPOINT 允許在事務內(nèi)部創(chuàng)建回滾點,部分 SQL 語句可以回滾,而不影響其他 SQL

BEGIN;

INSERT INTO users (user_account, hashed_password) VALUES ('Alice', 'xxxx');
SAVEPOINT sp1; -- 創(chuàng)建回滾點

INSERT INTO users (user_account, hashed_password) VALUES ('Alice2', 'xxxx');
SAVEPOINT sp2;

INSERT INTO users (user_account, hashed_password) VALUES ('Alice3', 'xxxx');
ROLLBACK TO sp2;

COMMIT; -- 提交事務

事務隔離級別

簡介

在數(shù)據(jù)庫中,事務隔離級別(Transaction Isolation Levels)用于控制多個事務并發(fā)執(zhí)行時的可見性,避免數(shù)據(jù)不一致的問題。PostgreSQL 遵循 ACID(原子性、一致性、隔離性、持久性) 原則,并提供四種事務隔離級別

隔離級別臟讀不可重復讀幻讀
讀未提交? 可能發(fā)生? 可能發(fā)生? 可能發(fā)生
讀已提交(默認)? 不會發(fā)生? 可能發(fā)生? 可能發(fā)生
可重復讀? 不會發(fā)生? 不會發(fā)生? 可能發(fā)生
可串行化? 不會發(fā)生? 不會發(fā)生? 不會發(fā)生

下面我們來逐一介紹

讀未提交/讀已提交

PostgreSQL 不真正支持 讀未提交 這個級別,而是當作 **讀已提交 **處理

即,就算你設置了這個級別,PG 數(shù)據(jù)庫還是會使用 讀已提交 級別事務隔離

臟讀示例(PG 不支持)

BEGIN; -- 事務1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
UPDATE users SET hashed_password = 'new_hash' WHERE user_account = 'Alice';
SELECT txid_current(); -- 查看當前事務id
-- 保持事務未提交

BEGIN; -- 事務2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM users WHERE user_account = 'Alice';
SELECT txid_current();


ROLLBACK; -- 釋放鎖,事務 2 的查詢繼續(xù)執(zhí)行

注意:我的 navacat17 版本,一個查詢頁面執(zhí)行的語句是同一個事務,所以想讓上面語句生效,你可能需要開啟兩個查詢頁面,分別執(zhí)行事務 1 和 2

不可重復讀

  • 事務 1
BEGIN;
SELECT hashed_password FROM users;
  • 事務 2
BEGIN;
UPDATE users SET hashed_password = 'xxxx';
COMMIT;
  • 事務 1
SELECT hashed_password FROM users;

問題:事務 1 在第一次 SELECT 時看到的是 hashed_password 與 第二次查詢時hashed_password 不一致,這就是不可重復讀

幻讀

  • 事務 1
BEGIN;
SELECT COUNT(*) FROM users; -- 假設是3
  • 事務 2
BEGIN;
INSERT INTO users (user_account, hashed_password) VALUES ('Alice4', 'xxxx');
COMMIT; -- 增加到4
  • 事務 1
SELECT COUNT(*) FROM users; -- 增加到4

問題:事務 1 在開始時認為 users 里數(shù)據(jù)為 3,但在事務進行中,別的事務插入了一條數(shù)據(jù),事務 1 重新查詢時,發(fā)現(xiàn)數(shù)據(jù)數(shù)量變了,這就是幻讀!

其余隔離級別,有需求可自行查詢~

設置事務隔離級別

在事務中設置

BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- SQL 語句
COMMIT;

在會話級別設置

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  • 這會影響當前會話中的所有事務

在 PostgreSQL 配置文件 postgresql.conf 設置(全局)

default_transaction_isolation = 'read committed'
  • 影響所有數(shù)據(jù)庫的默認隔離級別

自動提交

PostgreSQL 默認開啟自動提交模式,即每條 SQL 語句都會被自動提交。如果要手動管理事務,需要顯式使用 BEGIN

SET AUTOCOMMIT TO OFF;

到此這篇關于深入理解PostgreSQL 事務處理的文章就介紹到這了,更多相關PostgreSQL 事務處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 使用PostgreSQL為表或視圖創(chuàng)建備注的操作

    使用PostgreSQL為表或視圖創(chuàng)建備注的操作

    這篇文章主要介紹了使用PostgreSQL為表或視圖創(chuàng)建備注的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 在PostgreSQL中設置表中某列值自增或循環(huán)方式

    在PostgreSQL中設置表中某列值自增或循環(huán)方式

    這篇文章主要介紹了在PostgreSQL中設置表中某列值自增或循環(huán)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 臨時表空間的實現(xiàn)

    PostgreSQL 臨時表空間的實現(xiàn)

    PostgreSQL使用臨時表空間來存儲查詢執(zhí)行過程中產(chǎn)生的臨時數(shù)據(jù),本文主要介紹了PostgreSQL臨時表空間的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • postgresql 啟動與停止操作

    postgresql 啟動與停止操作

    這篇文章主要介紹了postgresql 啟動與停止操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 基于PostgreSQL的時序數(shù)據(jù)庫TimescaleDB的基本用法和概念

    基于PostgreSQL的時序數(shù)據(jù)庫TimescaleDB的基本用法和概念

    時序數(shù)據(jù)是指按照時間順序存儲的數(shù)據(jù),TimescaleDB是一個開源的、擴展了PostgreSQL的時序數(shù)據(jù)庫擴展,本文就給大家詳細的介紹一下基于PostgreSQL的時序數(shù)據(jù)庫TimescaleDB的基本用法和概念,需要的朋友可以參考下
    2023-06-06
  • CentOS 7下安裝PostgreSQL 9.6的教程分享

    CentOS 7下安裝PostgreSQL 9.6的教程分享

    PostgreSQL在我心目中的地位要遠遠高于MySQL,雖然流行對比MySQL低很對,但是功能性一致走在MySQL的前面。下面這篇文章主要介紹了CentOS 7下安裝PostgreSQL數(shù)據(jù)庫的方法,需要的朋友可以參考借鑒,一起來看看吧。
    2017-02-02
  • PostgreSQL初始化配置的實現(xiàn)小結

    PostgreSQL初始化配置的實現(xiàn)小結

    本文主要介紹了PostgreSQL初始化配置的實現(xiàn)小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-11-11
  • PostgreSQL設置時間自動更新的示例代碼

    PostgreSQL設置時間自動更新的示例代碼

    在我們?nèi)粘i_發(fā)中,在設計數(shù)據(jù)庫字段的時候不可避免的都要created_time以及updated_time兩個時間戳字段,作用大家也都一目了然,下面將為大家詳細介紹PostgreSQL設置時間自動更新的方法,需要的朋友可以參考下
    2025-03-03
  • PostgreSQL 分區(qū)表的 ALTER TABLE 語句執(zhí)行機制解析

    PostgreSQL 分區(qū)表的 ALTER TABLE 語句執(zhí)行機制解析

    這篇文章主要介紹了PostgreSQL 分區(qū)表的 ALTER TABLE 語句執(zhí)行機制解析的相關資料,需要的朋友可以參考下
    2026-02-02
  • PostgreSQL已經(jīng)存在的表怎么設置id自增長詳解

    PostgreSQL已經(jīng)存在的表怎么設置id自增長詳解

    這篇文章主要介紹了如何為已有的PostgreSQL表設置ID字段為自增,包括創(chuàng)建序列、設置默認值、可能的表結構修改以及重置序列的步驟,需要的朋友可以參考下
    2025-03-03

最新評論

新野县| 台州市| 隆昌县| 婺源县| 白银市| 锦州市| 凤翔县| 武冈市| 苏尼特右旗| 八宿县| 潼南县| 汉川市| 多伦县| 榆社县| 乐东| 尉氏县| 洛阳市| 河东区| 成都市| 阜城县| 岱山县| 虹口区| 开原市| 五华县| 泸西县| 上饶县| 加查县| 涿州市| 蓝山县| 泉州市| 南安市| 泽库县| 青龙| 陕西省| 榆树市| 阳原县| 阿拉善左旗| 渝中区| 金秀| 闽侯县| 德化县|