資料庫中的事務

2022-10-11 00:18:17 字數 3493 閱讀 8554

一.事務(transaction)

定義:事務就是乙個對資料庫操作的序列,是乙個不可分割的工作單位,要不這個序列裡面的操作全部執行,要不全部不執行。

特性:原子性 (atomicity) 永續性(durability) 一致性(consistency) 隔離性(isolation)

下面我將用銀行轉賬來舉例說明事務的acid特性

//

建立資料庫

create

table

bank

(id

intprimary

keynot

null

,name

varchar(50

),money

decimal

);//

兩個使用者註冊賬號存錢

insert

into bank(id,name,money) value(1,'

小胖',1000

);insert

into bank(id,name,money) value(2,'

小胖的爸爸馮天浩

',1000);

二.原子性事務的原子性是指乙個事務是乙個不可分割的工作單位,要不全部執行,要不全部不執行。

1.舉例

'小胖的爸爸馮天浩';

update bank set

money

=money

+100

where name='小胖

';commit;

2.可能出現的問題

在生活中如果出現了一些意外情況,例如小胖的爸爸馮天浩給小胖轉了100,但是由於突然斷電,小胖卻沒收到錢,小胖的爸爸的錢卻已經少了,這樣會產生糾紛。本質就是只執行了扣款語句,卻沒有執行加款語句。

3.解決措施

資料庫管理系統為了保證事務的原子性對乙個事務的執行時,會採取兩種措施,全部執行和全部不執行,這樣上述問題的結果就會變成兩種:小胖的爸爸馮天浩的money減少了100,小胖的money增加100或者小胖的爸爸沒有減少錢,小胖也沒增加錢。

三.一致性

一致性是指在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。這是說資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性。

在這簡單說一下約束,剛才我們說保持一致性就是不能破壞資料庫的約束,那麼什麼是資料庫的約束吶?簡而言之約束就是一些限制條件,限制你可以做什麼不可以做什麼。

1.舉例

對於上述銀行轉賬來說,無論轉錢是否成功,都必須要保證bank中money總數為2000。

2.解決措施

為了保證事務的一致性,從資料庫層面來看,在乙個事務執行的前後資料會符合我們之前設定的約束(唯一約束,外來鍵約束,check約束等)和觸發器設定。這一點是由sql server進行保證的。比如轉賬,則可以使用check約束兩個賬戶之和等於2000來達到一致性目的。

四.永續性

永續性即當乙個事提交後,對資料庫的改變是永久性的,不會被回滾。

sql service 通過write ahead transaction log 來保證事務的永續性,write ahead transaction log即在事務對資料庫的改變寫入資料庫之前首先寫入事務日誌檔案,而事務日誌檔案將按順序排序。當資料庫發生意外情況後,重啟sql service後首先會對事務事務日誌順序號進行檢查,將本應該對資料庫做改變卻未做的部分持久化到資料庫,來保證事務的永續性。

五.隔離性

事務隔離性是指多個事務併發執行時,相互之間無影響。

主要是在,多使用者,多併發的情況下,多個事務對同乙個資料進行訪問時,只能看到這個資料在上乙個事務修改前的狀態或者修改後的狀態,不會看到中間狀態的資料。

1.事務之間相互影響的種類

髒讀 不可重複讀 幻讀 丟失更新

1.1髒讀

髒讀:乙個事務讀取了另乙個事務未提交的資料,如下圖,此時小胖是受損的。

1.2不可重複讀

就是在乙個事務範圍內,兩次相同的查詢會返回兩個不同的資料,是因為在此間隔內有其他事務對資料進行了修改。如下圖:

1.3幻讀

幻讀,是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第乙個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.

如下圖:

1.4丟失更新

兩個事務同時讀取同一條記錄,a先修改記錄,b也修改記錄(b是不知道a修改過),b提交資料後b的修改結果覆蓋了a的修改結果。

2.sql server 中的資料庫的事務隔離級別

資料庫的事務隔離級別(transaction isolation level)是為了盡可能的避免上述事務之間的影響而產生的隔離級別。

sql server 隔離事務之間的影響是通過鎖來實現的,通過阻塞來隔離上述影響,級別越高,加的鎖越多,效率越地下。

未提交讀:在讀取資料時不會加任何鎖,也不會進行檢測,可能會讀到沒有提交的資料。

已提交讀:只讀取提交的資料等待其他事物釋放排他鎖,讀資料的共享鎖在讀操作完成後會立即釋放。這個隔離級別是sql server預設的隔離級別。

可重複讀:像已提交讀一樣,但共享鎖會保持到事物結束才會釋放。

可序列讀:類似於可重複讀,但鎖不僅會鎖定所查詢的資料,也會鎖定所查詢的範圍,這樣就阻止了新資料插入所查詢的範圍。

七.總結

事務的(acid)特性是由關聯式資料庫管理系統(rdbms,資料庫系統)來實現的。資料庫管理系統採用日誌來保證事務的原子性、一致性和永續性。日誌記錄了事務對資料庫所做的更新,如果某個事務在執行過程中發生錯誤,就可以根據日誌,撤銷事務對資料庫已做的更新,使資料庫退回到執行事務前的初始狀態。

mysql資料庫中的事務

1.什麼是事務 事務中有多個操作,這些操作的執行結果要麼完全成功,要麼完全失敗,不可能出現一部分成功,一部分失敗的情況。比如說轉賬業務 張三給李四轉100w,那麼有兩個操作,乙個是張三減去100w,李四加上100w,兩個操作都成功,要麼都失敗,不能出現張三減了100w,李四沒有加上100w的情況。2...

資料庫的事務

一 mysql事務 事務 邏輯上的一組操作,組成這組操作的單元,要麼都成功,要麼都不成功。mysql事務 jdbc如何控制事務 事務的特性 重點 acid 原子性 指事務是乙個不可分割的單位,事務中的操作要麼都發生,要麼都不發生 一致性 事務必須使資料從乙個一致性狀態轉化到另乙個一致性狀態 隔離性 ...

資料庫的事務

事務是指對系統的一組操作,它具有原子性,一致性,隔離性,永續性。原子性是指這組操作要麼全部成功,要麼全部失敗。一致性是指事務將系統從乙個一致狀態轉換到另乙個一致狀態。隔離性是指併發事務之間互相影響的程度。事務的隔離性有四個級別 read uncommitted 最低的隔離級別,什麼都不需要做,乙個事...