資料庫事務知識整理

来源:https://www.cnblogs.com/ayic/archive/2022/10/20/16704699.html
-Advertisement-
Play Games

什麼是資料庫事務? 事務,就是一系列操作的整體,其結果就是這一系列操作要麼全部成功,要麼全部失敗。 譬如說,一個經典的例子--轉賬。 A要轉帳給B 100塊錢,要經歷以下步驟: 1、扣除A賬戶100塊錢。 2、增加B賬戶100塊錢。 以上例子里的兩個步驟,要麼全部成功,要麼全部失敗,不然,就亂套了。 ...


image

什麼是資料庫事務?

事務,就是一系列操作的整體,其結果就是這一系列操作要麼全部成功,要麼全部失敗。

譬如說,一個經典的例子--轉賬。
A要轉帳給B 100塊錢,要經歷以下步驟:
1、扣除A賬戶100塊錢。
2、增加B賬戶100塊錢。

以上例子里的兩個步驟,要麼全部成功,要麼全部失敗,不然,就亂套了。在這裡,我們可以看出,事務保證了完整性。那麼,說到資料庫事務,就是一系列對資料庫的操作,要麼全部成功(提交),要麼全部失敗(回滾),保證了數據的完整性。

資料庫事務的四大特性(ACID)

ACID,指資料庫事務四個特性的英文單詞縮寫,包括原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務的資料庫,必需要具有這四種特性,否則在事務過程當中無法保證數據的正確性。

1、原子性(Atomicity)

說的是一個事務內所有操作共同組成一個原子包,要麼全部成功,要麼全部失敗。這是最基本的特性。

2、一致性(Consistency)

電腦指令是有先後順序的,這樣就決定了資料庫提交事務會有一個過程。如果提交的時候,存在一個時間差,在提交的第一秒,一個刪除過程還沒完成到了第三秒才完成,會不會第一秒訪問的人和第三秒訪問的人得到不同的結果?出現不一致,狀態的混沌?為了防止這樣的情況,資料庫事務的一致性就規定了事務提交前後,永遠只可能存在事務提交前的狀態或事務提交後的狀態,從一個一致性的狀態到另一個一致性狀態,而不可能出現中間的過程態。也就是說事務的執行結果是量子化狀態,而不是線性狀態。 這就是一致性得保證的只會有前狀態和後狀態,絕不會出現中間態。

3、隔離性(Isolation)

當多個事務併發執行時,有可能會出現臟讀,不可重覆讀,幻讀等問題,事務的隔離就是為瞭解決這些問題。資料庫為了保證事務隔離性,會有很多鎖方案。

4、持久性(Durability)

當一個事務提交之後,資料庫狀態永遠的發生了改變。這個事務只要提交了,哪怕提交後宕機,他也確確實實的提交了,不會出現因為剛剛宕機了而讓提交不生效。

事務併發產生的問題

一個系統,在同一時刻,往往有多個人在使用。這樣,就有可能出現事務併發。事務併發就是多個事務在同時執行。如果沒有事務隔離,那麼事務併發有可能產生更新丟失、臟讀、不可重覆讀、幻讀等問題。

更新丟失
兩個事務都同時更新一行數據,但是第二個事務卻中途失敗退出,導致對數據的兩個修改都失效了。

臟讀
臟讀又稱無效數據讀出。一個事務讀取另外一個事務還沒有提交的數據。例如,事務T1修改了一行數據,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的數據,之後事務T1因為某種原因Rollback了,那麼事務T2讀取的數據就是髒的。

不可重覆讀
指在同一個事務內,對同一行數據的多次查詢,返回了不同的結果。例如,事務T1第一次查詢了某行數據,然後事務T2對這行數據的某個欄位做了修改,並且提交了數據。事務T1第二次查詢該行數據的時候,得到了事務T2修改過的結果。不可重覆讀和臟讀的區別在於,臟讀是讀了未提交的數據,而不可重覆讀是讀了提交了的數據。當然,不可重覆讀在某些情況下並不是問題,有時候我們就是要在同一事務下查詢到數據的最新狀態。

幻讀
幻讀又稱虛讀。同一條SQL語句在同一個事務中的多次查詢,得到的數據量(條數)不一樣。例如,事務T1第一次統計某個表的數據量,有100行。這時,事務T2對這個表插入了一行數據。事務T1第二次統計這個表的數據量,有101行。這就是幻讀。幻讀和不可重覆讀的區別在於,不可重覆讀的重點是修改,同樣的條件,第一次和第二次讀取的值不一樣。而幻讀的重點在於新增或者刪除,同樣的條件, 第一次和第二次讀出來的記錄數不一樣。

事務隔離級別

事務隔離就是為瞭解決事務併發帶來的問題。事務隔離級別,就是多個事務之間的數據互不影響的程度。級別越高,越能保證數據的完整性和一致性。下麵由低到高介紹事務隔離級別。

READ_UNCOMMITTED(未授權讀取級別)
以操作同一行數據為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他寫事務(但允許其他讀事務)。此隔離級別可以防止更新丟失,但不能防止臟讀、不可重覆讀、幻讀。此隔離級別可以通過“排他寫鎖”實現。

READ_COMMITTED(授權讀取級別)
以操作同一行數據為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、臟讀,但不能防止不可重覆讀、幻讀。此隔離級別可以通過“瞬間共用讀鎖”和“排他寫鎖”實現。

REPEATABLE_READ(可重覆讀取級別)
以操作同一行數據為前提,讀事務禁止其他寫事務(但允許其他讀事務),未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、臟讀、不可重覆讀,但不能防止幻讀。此隔離級別可以通過“共用讀鎖”和“排他寫鎖”實現。

SERIALIZABLE(序列化級別)
提供最嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能併發執行。此隔離級別可以防止更新丟失、臟讀、不可重覆讀、幻讀。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

事務隔離級別越高越好嗎?

隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為Read Committed。它能夠避免更新丟失、臟讀,而且具有較好的併發性能。儘管它會導致不可重覆讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

本文來自博客園,作者:Yi00,轉載請註明原文鏈接:https://www.cnblogs.com/ayic/p/16704699.html

聊聊技術,聊聊人生。歡迎關註我的公眾號!^_^


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 管理配置Ansible Ansible清單 定義清單 清單定義Ansible將要管理的一批主機。這些主機也可以分配到組中,以進行集中管理。組可以包含子組,主機也可以是多個組的成員。清單還可以設置應用到它所定義的主機和組的變數。 可以通過兩種方式定義主機清單。靜態主機清單可以通過文本文件定義。動態主機 ...
  • logrotate: logrotate 程式是一個日誌文件管理工具。用來把舊的日誌文件刪除,並創建新的日誌文件,稱為日誌轉儲或滾動。 作用: 可以根據日誌文件的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行 logrotate 相關文件: 計劃任務:/etc/cron.dai ...
  • loganalyzer: loganalyzer是用 php 語言實現的日誌管理系統,可將MySQL資料庫的日誌用豐富的WEB方式進行展示 官網:https://loganalyzer.adiscon.com 環境準備: 日誌客戶端:10.0.0.12 日誌伺服器:10.0.0.11 資料庫伺服器: ...
  • 如何修改屏幕解析度?switchresx mac是一款Mac上實用的屏幕解析度修改工具,快速的幫助您更改Mac顯示屏的解析度。操作界面簡單,採用嵌套的上下文菜單管理,更加方便您控制修改解析度的尺寸。 詳情:SwitchResX for Mac(屏幕解析度修改工具) 功能介紹 1、偏好窗格 switc ...
  • log-Client:10.0.0.12 log-Server:10.0.0.11 mysql:10.0.0.13 實現步驟: 啟用網路日誌服務的配置: https://www.cnblogs.com/heyongshen/p/16808684.html 1.在rsyslog伺服器上安裝連接mysq ...
  • 想要一款圖像調色軟體?小編為大家推薦Image 2 LUT Pro Mac版,一款專業的圖像調色小工具。Image 2 LUT Pro Mac版提供了一些非常有用的選項。除了著色的一般強度,您還可以控制其對圖像中膚色的影響。Image 2 LUT Pro Mac不需要專業的調試技術,幾個簡單的步驟就 ...
  • Linux下載安裝jdk1.8 一、下載 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/o ...
  • rsyslog 系統日誌服務 rsyslog服務是CentOS 6 以後版本的系統日誌管理服務。 特點: 性能高、安全性好、基於模塊化設計 官方網站: https://www.rsyslog.com/ rsyslog系統日誌術語 facility:設施,從功能或程式上對日誌進行歸類 Priority ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...