資料庫事務

2022-09-15 09:06:12 字數 2495 閱讀 1800

資料庫事務(database transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。舉例說就是:在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!

如果乙個資料庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性(acid):原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、永續性(durability)。

原子性(atomicity):

乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣,不能對資料庫有任何影響。

一致性(consistency):

在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續資料庫可以自發性地完成預定的工作。比如銀行轉賬操作,假設使用者a和使用者b兩者的錢加起來一共是2000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是2000。

隔離性(isolation):

資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,但要做到防止多個事務併發執行時由於交叉執行而導致資料的不一致。比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。

事務的隔離性資料庫提供了多種隔離級別(其中提到的髒讀、幻讀、不可重複讀將在下面降到):

① serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

② repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

③ read committed (讀已提交):可避免髒讀的發生。

④ read uncommitted (讀未提交):最低級別,任何情況都無法保證。

在mysql資料庫中,支援上面四種隔離級別,預設的為repeatable read (可重複讀);而在oracle資料庫中,只支援serializable (序列化)級別和read committed (讀已提交)這兩種級別,其中預設的為read committed級別。

永續性(durability):永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。依舊以銀行轉賬為例,使用者a給使用者b進行轉賬操作,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤,導致轉賬操作出現錯誤。

在上述介紹隔離性時講到髒讀、幻讀、不可重複讀。當多個執行緒都開啟事務運算元據庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性,在介紹資料庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:

髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。

eg:當乙個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時乙個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。例如:使用者a向使用者b轉賬1000元,對應sql命令如下

update account set money=money+1000 where name=』b』;  (此時a通知b)

update account set money=money - 1000 where name=』a』;

當只執行第一條sql時,a通知b檢視賬戶,b發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條sql是否執行,只要該事務不提交,則所有操作都將回滾,那麼當b以後再次檢視賬戶時就會發現錢其實並沒有轉。

不可重複讀是指在對於資料庫中的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另乙個事務修改並提交了。

eg:事務s1在讀取某一資料,而事務s2立馬修改了這個資料並且提交事務給資料庫,事務s1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。

不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另乙個事務未提交的髒資料,而不可重複讀則是讀取了前一事務提交的資料。

在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個資料當然以最後查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如對於同乙個資料a和b依次查詢就可能不同,a和b就可能打起來。

幻讀是事務非獨立執行時發生的一種現象。例如事務s1對乙個表中所有的行的某個資料項做了從「1」修改為「2」的操作,這時事務s2又對這個表中插入了一行資料項,而這個資料項的數值還是為「1」並且提交給資料庫。而操作事務s1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務s2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。

幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同乙個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。

資料庫事務

事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...

資料庫 事務

資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...

資料庫事務

這段時間面試,由於基礎不是特別好,遇到一些要筆試的公司。就會表示出來 今天有人問我,資料庫事務 是什麼。我只感覺十分熟悉。但是又說不出所以然。回來找了一下,現在整理記錄 1 定義 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...