資料庫事務

2021-08-17 03:48:49 字數 2754 閱讀 4917

什麼是事務(transaction)?

事務是指作為單個邏輯單元執行一系列操作,要麼完全的執行,要麼完全的不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯單元工作要成為事務,必須滿足所謂的acid(原子性、一致性、隔離性、永續性)屬性。事務是資料庫執行中的乙個邏輯工作單位,由dbms中的事務管理子系統負責事務的處理。

舉個例子:同乙個銀行轉賬,假設a有1000元,b有500元,現在a要向b轉賬200元,要做的一系列操作就是:a減少200元,為800元,而b加上200元,為700元,這樣一系列操作就可以構成乙個事務,我們在做這些操作的時候,不可能只從a賬戶減少200元,而不為b賬戶增加200元,這樣就會出現嚴重的後果,只有減少操作,而沒有增加操作。所以上面的一系列操作要麼全部都做,a減少200元,b增加200元,否則就都不要做,即a不減少,b也不增加。有人可能會說,那要是給a減少200元成功了,而在給b增加200元的過程中出錯了,那怎麼辦?那就回滾唄,把給a減少的200元,再給a加上,回到沒執行這個事務之前的狀態就行了。

事務的4個特性

原子性(atomic):事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。通常,與某個事務相聯的操作具有共同的目標,並且是相互依賴的,如果系統執行這些操作的乙個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。

一致性(consistency):事務的一致性是指在乙個事務執行之前和執行之後資料庫都必須處於一致性狀態。這種特性稱為事務的一致性。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。

隔離性(isolation):由併發事務所做的修改必須與任何其他併發事務所做的修改隔離。事務檢視資料時資料所處的狀態,到底是另乙個事務執行之前的狀態還是處於中間某個狀態,相互之間存在什麼影響,是可以通過隔離級別的設定來控制的。

永續性(durability):事務結束後,事務處理的結果必須能夠得到固化,即寫入資料庫檔案中即使機器宕機資料也不會丟失,他對於系統的影響是永久性的。

事務併發控制

假設有乙個order表,有個字段叫count,作為計數用,當前值為100。

第一類丟失更新(update lost):此種更新丟失是因為回滾的原因,所以也叫回滾丟失。此時兩個事務同時更新count,兩個事務都讀取到100,事務一更新成功並提交,count=100+1=101,事務二出於某種原因更新失敗了,然後回滾,事務就把count還原為它一開始讀到的100,此時事務一的更新就這樣丟失了。

第二類丟失更新(second update lost):此種更新丟失是因為更新被其他事務覆蓋了,也可以叫覆蓋丟失。舉個例子,兩個事務同時更新count,都讀取到100這個初始值,事務一先更新成功並提交,count=100+1=101,事務二后更新成功並提交,count=100+1=101,由於事務二count還是從100開始增加,事務一的更新就這樣丟失了。

髒讀(dirty read):此種異常是因為乙個事務讀取了另乙個事務修改了但是未提交的資料。舉個例子,事務一更新了count=101,但是沒有提交,事務二此時讀取count,值為101而不是100,然後事務一由於某種原因回滾了,然後第二個事務讀取的這個值就是髒資料。

不可重複讀(not repeatable read):此種異常是乙個事務對同一行資料執行了兩次或更多次查詢,但是卻得到不同的結果,也就是在乙個事務裡面你不能重複(多次)讀取一行資料,如果這個做了,那就不能保證每次讀取的結果是一樣的,有可能一樣也有可能不一樣,造成這個結果是在兩次查詢之間有別的事務對該行資料做了更新操作。舉個例子,事務一先查詢了count,值為100,此時事務二更新了count=101,事務一再次讀取count,值變成了101,兩次讀取結果不一樣。

幻讀(phantom read):幻讀和不可重複讀有點像,只是針對的不是資料的值而是資料的數量。此種異常是乙個事務在兩次查詢的過程中資料的數量不同,讓人以為發生幻覺。舉個例子,事務一查詢order表有多少記錄,事務二更新了一條記錄,發現和第一次不一樣,這就是幻讀。

資料庫事務隔離級別

資料庫的隔離級別實現一般是通過資料庫鎖實現的。

讀未提交(read uncommitted):該隔離級別指即使乙個事務的更新語句沒有提交,但是別的事務可以讀到這個改變,幾種異常情況都可能出現。(髒讀、不可重複讀、幻讀)

讀已提交(read committed):該隔離級別指乙個事務只能看到其他事務的已經提交的更新,看不到未提交的更新,消除了髒讀和第一類丟失更新,這是大多數資料庫的預設隔離級別,如oracle,sqlserver。(不可重複讀、幻讀)

可重複讀(repeatable read):該隔離級別指乙個事務中進行了兩次或者多次對於資料內容的查詢,得到的結果是一樣的,但不保證對於資料條數的查詢是一樣的,只要存在讀改行資料就禁止寫,消除了不可重複讀和第二類更新丟失,這是mysql資料庫的預設隔離級別。(幻讀)

可序列化(serializable):指這個事務執行的時候不允許別的事務併發執行,完全序列化的讀,只要存在讀就禁止寫,但可以同時讀,消除了幻讀。這是事務隔離的最高端別,雖然最安全,但是效率太低。

資料庫事務

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

資料庫 事務

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

資料庫事務

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