徹底理解資料庫事務

2022-03-13 05:43:53 字數 1863 閱讀 9285

事務(transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元(unit)。在計算機術語中,事務通常就是指資料庫事務。

乙個資料庫事務通常包含對資料庫進行讀或寫的乙個操作序列。它的存在包含有以下兩個目的:

1、為資料庫操作提供了乙個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。

2、當多個應用程式在併發訪問資料庫時,可以在這些應用程式之間提供乙個隔離方法,以防止彼此的操作互相干擾。

當乙個事務被提交給了dbms(資料庫管理系統),則dbms需要確保該事務中的所有操作都成功完成且其結果被永久儲存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態(要麼全執行,要麼全都不執行);同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的執行。

但在現實情況下,失敗的風險很高。在乙個資料庫事務的執行過程中,有可能會遇上事務操作失敗、資料庫系統/作業系統失敗,甚至是儲存介質失敗等情況。這便需要dbms對乙個執行失敗的事務執行恢復操作,將其資料庫狀態恢復到一致狀態(資料的一致性得到保證的狀態)。為了實現將資料庫狀態恢復到一致狀態的功能,dbms通常需要維護事務日誌以追蹤事務中所有影響資料庫資料的操作。

並非任意的對資料庫的操作序列都是資料庫事務。事務應該具有4個屬性:原子性、一致性、隔離性、永續性。這四個屬性通常稱為acid特性。

原子性(atomicity):事務作為乙個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。

一致性(consistency):事務應確保資料庫的狀態從乙個一致狀態轉變為另乙個一致狀態。一致狀態的含義是資料庫中的資料應滿足完整性約束。

隔離性(isolation):多個事務併發執行時,乙個事務的執行不應影響其他事務的執行。

永續性(durability):乙個事務一旦提交,他對資料庫的修改應該永久儲存在資料庫中。

用乙個常用的「a賬戶向b賬號匯錢」的例子來說明如何通過資料庫事務保證資料的準確性和完整性。熟悉關係型資料庫事務的都知道從帳號a到帳號b需要6個操作:

1、從a賬號中把餘額讀出來(500)。

2、對a賬號做減法操作(500-100)。

3、把結果寫回a賬號中(400)。

4、從b賬號中把餘額讀出來(500)。

5、對b賬號做加法操作(500+100)。

6、把結果寫回b賬號中(600)。

保證1-6所有過程要麼都執行,要麼都不執行。一旦在執行某一步驟的過程中發生問題,就需要執行回滾操作。 假如執行到第五步的時候,b賬戶突然不可用(比如被登出),那麼之前的所有操作都應該回滾到執行事務之前的狀態。

在轉賬之前,a和b的賬戶中共有500+500=1000元錢。在轉賬之後,a和b的賬戶中共有400+600=1000元。也就是說,資料的狀態在執行該事務操作之後從乙個狀態改變到了另外乙個狀態。同時一致性還能保證賬戶餘額不會變成負數等。

在a向b轉賬的整個過程中,只要事務還沒有提交(commit),查詢a賬戶和b賬戶的時候,兩個賬戶裡面的錢的數量都不會有變化。

如果在a給b轉賬的同時,有另外乙個事務執行了c給b轉賬的操作,那麼當兩個事務都結束的時候,b賬戶裡面的錢應該是a轉給b的錢加上c轉給b的錢再加上自己原有的錢。

一旦轉賬成功(事務提交),兩個賬戶的裡面的錢就會真的發生變化(會把資料寫入資料庫做持久化儲存)!

一致性與原子性是密切相關的,原子性的破壞可能導致資料庫的不一致,資料的一致性問題並不都和原子性有關。

比如剛剛的例子,在第五步的時候,對b賬戶做加法時只加了50元。那麼該過程可以符合原子性,但是資料的一致性就出現了問題。

因此,事務的原子性與一致性缺一不可。

資料庫事務與鎖 詳解一 徹底理解資料庫事務

註明 本文 自 事務 transaction 一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在計算機術語中,事務通常就是指資料庫事務。乙個資料庫事務通常包含對資料庫進行讀或寫的乙個操作序列。它的存在包含有以下兩個目的 1 為資料庫操作提供...

理解資料庫中的事務

什麼是事務?我們知道,資料庫是乙個面向多使用者的共享機制,因此資料庫管理系統應當具備併發控制和封鎖機制,保證資料庫系統的正常執行。但是當多個使用者訪問資料庫的時候,如果每乙個使用者程式乙個乙個的序列執行,則每一時刻只有乙個使用者執行對資料庫的操作,其他使用者必須等待,這樣的話會嚴重影響資料庫資源的使...

簡單例子理解資料庫事務

建立表 建立農行賬戶表bank if exists select from sysobjects where name bank drop table bank gocreate table bank customername char 10 顧客姓名 currentmoney money 當前餘額...