【PostgreSQL】守護數據安全:事務與數據完整性管理

目錄

事務管理:確保操作的原子性

事務的概念與重要性

事務的啟動與提交

事務的回滾(ROLLBACK)(

數據一致性與隔離級別

隔離級別的解釋

設置隔離級別

錯誤處理與事務的高級策略

異常處理(SAVEPOINT & EXCEPTION)

自動提交與手動控制

注意

并發控制與鎖

悲觀鎖(Pessimistic Lock)

樂觀鎖(Optimistic Lock)


事務管理:確保操作的原子性

? ? 事務是數據庫操作的基本單位,確保數據的一致性和完整性,本節深入探討事務的定義、啟動與結束。

事務的概念與重要性

事務是一系列操作的集合,這些操作要么全部成功,要么全部失敗,保持數據的原子性。理解事務對于防止數據不一致至關重要。

事務的啟動與提交
  • BEGIN:顯式開啟一個新的事務。
BEGIN;
INSERT INTO accounts (balance) VALUES (1000);
  • COMMIT:提交事務,永久保存更改。
    COMMIT;
    事務的回滾(ROLLBACK)(
  • 當事務中的一部分操作失敗時,使用ROLLBACK撤銷所有已做的更改。
    /*由于錯誤,賬戶余額減少的操作被撤銷,保持數據的原始狀態。*/
    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    -- 假設這里出現了一個錯誤
    ROLLBACK;
    數據一致性與隔離級別

    理解事務的隔離級別是處理并發操作時保持數據一致性的關鍵。

    隔離級別的解釋
  • READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE:從低到高依次提供更強的隔離性,但也可能影響并發性能。

  • 示例說明隔離級別差異:

    -- 假設有兩個事務T1和T2同時操作賬戶表
    -- 在SERIALIZABLE級別下,T1的讀取不會看到T2未提交的更改,確保數據的一致性。
    設置隔離級別
  • 顯示當前會話的隔離級別:
SHOW transaction_isolation;
  • 修改隔離級別:
    SET SESSION transaction_isolation TO 'REPEATABLE READ';
    錯誤處理與事務的高級策略

    掌握如何在遇到錯誤時優雅地處理事務,以及使用保存點和異常塊等高級特性。

    異常處理(SAVEPOINT & EXCEPTION)
  • 使用SAVEPOINT標記事務中的特定點,以便在遇到錯誤時回滾到該點而不是整個事務。
    BEGIN;
    SAVEPOINT before_update;
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    -- 如果更新失敗
    ROLLBACK TO SAVEPOINT before_update;
    自動提交與手動控制

? ? ?在PostgreSQL中,事務的管理對于數據一致性和可靠性至關重要。以下是關于PostgreSQL自動提交與手動控制事務的區別:

特性自動提交模式手動提交模式
默認行為默認開啟(大多數情況下,除非特定配置更改)需要手動開啟,某些版本或配置下可能為默認
事務邊界每個SQL語句執行完后自動提交,形成獨立事務事務開始于BEGIN,結束于COMMITROLLBACK
控制粒度粗粒度,每個操作自動完成細粒度,允許一組操作作為一個整體提交或回滾
數據修改即時性數據修改立即生效,無法撤銷單個語句數據修改直到COMMIT才對外可見,可控制回滾
示例代碼直接執行SQL語句,如?INSERT INTO table VALUES (...);BEGIN; <SQL操作>; COMMIT;?或?ROLLBACK;
適用場景快速操作,無需復雜事務邏輯或高度一致性的簡單應用需要精確控制事務邊界,保證數據完整性和一致性
注意
  • 自動提交簡化了編程模型,減少了忘記提交事務的風險,但可能不適合需要多個操作原子性完成的場景。
  • 手動提交提供了更細粒度的控制,適用于需要執行多條SQL語句且這些語句必須全部成功或全部失敗的情況。
  • 在PostgreSQL中,可以通過設置AUTOCOMMIT參數來改變默認行為,例如使用SET AUTOCOMMIT TO OFF;來關閉自動提交,進入手動提交模式。
并發控制與鎖

? ? 在PostgreSQL中,悲觀鎖和樂觀鎖是兩種不同的并發控制策略,用于處理多用戶環境下對共享資源的訪問,以避免數據不一致性和并發沖突。

悲觀鎖(Pessimistic Lock)

? ? ?悲觀鎖假定在事務處理過程中數據很可能發生并發沖突,因此采取一種預防性的鎖定策略。在開始讀取或修改數據前,悲觀鎖會先鎖定數據,確保在整個事務期間,沒有其他事務能夠修改這些數據。這種方式可以有效防止并發沖突,但可能會降低系統的并發性能,因為資源被鎖定期間,其他需要訪問這些資源的事務會被阻塞等待。

在PostgreSQL中,可以使用SELECT ... FOR UPDATESELECT ... FOR SHARE語句顯式地申請悲觀鎖。這些鎖會在事務結束時自動釋放,無論是通過COMMIT還是ROLLBACK。例如:

BEGIN;
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;
-- 進行一些業務邏輯處理...
COMMIT;

這段代碼會鎖定id為1的行,阻止其他事務修改或刪除這行數據,直到當前事務結束。

樂觀鎖(Optimistic Lock)

樂觀鎖則假設在事務處理過程中數據并發沖突的概率較低,因此它不會一開始就鎖定數據。相反,樂觀鎖會在事務開始時記錄數據的一個版本標識(通常是通過在表中添加一個版本字段,如version),然后在事務提交前檢查數據的版本是否發生變化。如果版本未變,說明沒有沖突,事務可以正常提交;如果有其他事務已經修改了數據(即版本號不同),則當前事務通常會回滾,由應用程序決定如何處理這種情況(如重新嘗試事務)。

在PostgreSQL中,樂觀鎖的實現依賴于應用程序的邏輯,通常涉及在更新時檢查數據版本。例如:

  • 讀取數據時,同時讀取版本字段:
SELECT * FROM my_table WHERE id = 1;
  • 更新數據時,比較版本字段:
    BEGIN;
    UPDATE my_table 
    SET column = value, version = version + 1 
    WHERE id = 1 AND version = original_version_from_read;-- 如果影響行數為0,表示版本不匹配,可能有并發修改
    GET DIAGNOSTICS result = ROW_COUNT;
    IF result = 0 THEN-- 處理并發沖突,如回滾事務或重新嘗試
    END IF;
    COMMIT;

    ? ? 在這個例子中,version字段在更新時會增加,更新語句只有在原始讀取的版本與數據庫中的版本相匹配時才會執行成功,從而檢測并發修改。

? ? ? 悲觀鎖適用于并發沖突頻繁、對數據一致性和實時性要求較高的場景,而樂觀鎖適用于并發沖突較少、追求高并發性能的場景。選擇哪種鎖策略需根據實際應用場景權衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36765.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

25屆最近5年重慶郵電大學自動化考研院校分析

重慶郵電大學 目錄 一、學校學院專業簡介 二、考試科目指定教材 三、近5年考研分數情況 四、近5年招生錄取情況 五、最新一年分數段圖表 六、歷年真題PDF 七、初試大綱復試大綱 八、學費&獎學金&就業方向 一、學校學院專業簡介 二、考試科目指定教材 1、考試…

[數據集][目標檢測]電纜鋼絲繩線纜缺陷檢測數據集VOC+YOLO格式1800張3類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;1800 標注數量(xml文件個數)&#xff1a;1800 標注數量(txt文件個數)&#xff1a;1800 標注…

單例模式(下)

文章目錄 文章介紹步驟安排及單例講解step1&#xff1a;注冊單例類型&#xff08;main.cpp&#xff09;step2&#xff1a;定義類和私有構造函數&#xff08;keyboardinputmanager.h&#xff09;step3:&#xff08;keyboardinputmanager.cpp&#xff09;step4&#xff1a;在qml中…

雷卯一站式解決電子設備靜電浪涌與接口安全

在快速演進的數字時代&#xff0c;電子設備不僅是日常生活的核心&#xff0c;更是工業自動化、智能穿戴、智能家居乃至未來交通的基石。然而&#xff0c;隨著技術邊界的不斷拓展&#xff0c;設備面臨的挑戰也日益嚴峻&#xff0c;尤其是來自靜電放電(ESD)、浪涌沖擊及電磁干擾的…

【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 特殊加密算法(200分) - 三語言AC題解(Python/Java/Cpp)

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解 &#x1f4bb; ACM銀牌&#x1f948;| 多次AK大廠筆試 &#xff5c; 編程一對一輔導 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; &#x1f…

Rust 跨平臺-Android 和鴻蒙 OS

1. 安裝 rustup rustup 是 Rust 的安裝和版本管理工具 $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 該命令會安裝 rusup 和最新的穩定版本的 Rust&#xff1b;包括&#xff1a; rustc Rust 編譯器&#xff0c;用于將 Rust 代碼編譯成可執行文件或庫。 ca…

技術速遞|Visual Studio Code 的 .NET MAUI 擴展現已正式發布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我們非常高興地宣布 .NET MAUI VS Code 擴展插件結束了預覽階段&#xff0c;并將包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 擴展插件&…

GuLi商城-商品服務-API-三級分類-刪除-頁面效果

一步步學習Vue太慢了&#xff0c;準備跳過前端的學習&#xff0c;直接使用前端完整的項目 下載依賴npm install&#xff0c;會報錯&#xff0c;排查了好久 我安裝的是Node14&#xff0c;所以必須要安裝4.14 Vscode終端輸入&#xff1a;npm install node-sass4.14 輸入&#x…

【Android面試八股文】如果需要在Activity間傳遞大量的數據怎么辦?

文章目錄 1. 使用Intent傳遞數據2. 使用靜態變量3. 使用Parcelable或Serializable接口4. 使用文件5. 使用數據庫存儲6. 使用ContentProvider7. 匿名共享內存(Ashmem)總結在Android開發中,如果需要在Activity之間傳遞大量數據,可以采取以下幾種方法: 1. 使用Intent傳遞數據…

【博士每天一篇文獻-綜述】A survey on few-shot class-incremental learning

閱讀時間&#xff1a;2023-12-19 1 介紹 年份&#xff1a;2024 作者&#xff1a;田松松&#xff0c;中國科學院半導體研究所&#xff1b;李璐思&#xff0c;老道明大學助理教授&#xff1b;李偉軍&#xff0c;中國科學院半導體研究所AnnLab&#xff1b; 期刊&#xff1a; Neu…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 進行離屏渲染

系列文章目錄 LearnOpenGL 筆記 - 入門 01 OpenGLLearnOpenGL 筆記 - 入門 02 創建窗口LearnOpenGL 筆記 - 入門 03 你好&#xff0c;窗口LearnOpenGL 筆記 - 入門 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 與 VBO 之間的關系LearnOpenGL - Android OpenGL ES 3.0 繪制…

《Windows API每日一練》6.4 程序測試

前面我們討論了鼠標的一些基礎知識&#xff0c;本節我們將通過一些實例來講解鼠標消息的不同處理方式。 本節必須掌握的知識點&#xff1a; 第36練&#xff1a;鼠標擊中測試1 第37練&#xff1a;鼠標擊中測試2—增加鍵盤接口 第38練&#xff1a;鼠標擊中測試3—子窗口 第39練&…

3.imput 字符串常用方法 字符串倒序,切片

1.input input()函數接收一個標準輸入數據返回string類型 2.字符串常用方法 upper()將字符串中的小寫字母變為大寫 lower()大寫變小寫 len()獲取長度 count(子字符串)統計某個字符出現的次數 index(子字符串)可以返回子字符串出現的位置, rindex從右邊找 find(子字符串)可以返回…

vite-ts-cesium項目集成mars3d修改相關的包和配置參考

如果vite技術棧下使用原生cesium&#xff0c;請參考下面文件的包和配置修改&#xff0c;想用原生創建的viewer結合我們mars3d的功能的話。 1. package.json文件 "dependencies": {"cesium": "^1.103.0","mars3d": "^3.7.18&quo…

重啟ubuntu后命令行出現(initramfs),無圖形界面問題。

由于ubuntu內部軟件問題&#xff0c;需要重啟ubuntu&#xff0c;導致重啟后圖像界面消失&#xff0c;出現如下的命令行&#xff1a; (initramfs): 這里表示進入圖形界面初始化時&#xff0c;某個分區的文件損壞&#xff0c;損壞文件名稱會在上方顯示。 解決方法&#xff1a;…

深度學習 - Transformer 組成詳解

整體結構 1. 嵌入層&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在讀一本書&#xff0c;你不認識某個單詞&#xff0c;于是你查閱字典。字典為每個單詞提供了一個解釋&#xff0c;幫助你理解這個單詞的意思。嵌入層就像這個字典&#xf…

Micrometer+ZipKin分布式鏈路追蹤

目錄 背景MicrometerMicrometer與ZipKin之間的關系專業術語分布式鏈路追蹤原理 ZipKin安裝下載 MicrometerZipKin 案例演示相關文獻 背景 一個系統頁面上的按鈕點擊到結果反饋&#xff0c;在微服務框架里&#xff0c;是由N個服務組成返回結果&#xff0c;中間可能經過a->b-…

【Electron】Electron入門實現

Electron 學習筆記 Electron 是一個開源框架&#xff0c;允許開發者使用網頁技術&#xff08;HTML、CSS 和 JavaScript&#xff09;來構建跨平臺的桌面應用程序。它由 GitHub 開發并維護&#xff0c;最初是為了支持開發 Atom 編輯器。Electron 結合了 Chromium&#xff08;用于…

密碼學及其應用 —— 對稱加密技術

1. 對稱加密、流加密和塊加密 1.1 對稱加密 對稱加密&#xff08;也稱為密鑰加密&#xff09;是一種加密方式&#xff0c;其中加密和解密使用相同的密鑰。這種加密方法基于二進制層面的操作&#xff0c;如XOR&#xff08;異或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目錄 一、Redis Stream1.1 場景1&#xff1a;多個客戶端可以同時接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;發消息 &#xff09;1.1.2 XREAD - 從stream中讀取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 從stream指定區間讀取Entry&#xff08;收消息&…