資料庫事務

2021-08-30 19:34:24 字數 2572 閱讀 2750

所謂的事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。

例如,銀行轉賬工作:從乙個賬號扣款並使另乙個賬號增款,這兩個操作要麼都執行,要麼都不執行。所以,應該把它們看成乙個事務。

事務是資料庫維護資料一致性的單位,在每個事務結束時,都能保持資料一致性。針對上面的描述可以看出,事務的提出主要是為了解決併發情況下保持資料一致性的問題。

原子性(atomicity):事務中的操作都是不可分割的原子單位,事務中所有的操作要麼全部成功,要麼全部失敗。

一致性(consistemcy):事務執行後,資料庫的狀態與他的業務規則應該保持不變。比如轉賬業務,轉賬前後,兩個賬戶的總額是不變的。

隔離性(isolation):隔離是在併發操作中,不同事務之間應該隔離開來,使得每個併發事務都互不干擾。

永續性(durability):一旦事務提交成功,事務中所有的資料操作都必須被持久化到資料庫中,即使提交事務,資料庫馬上崩潰,在資料庫重新啟動完,資料庫中的資料也要保持不變。

資料庫開啟事務命令:

start transaction:開啟事務

rollback:回滾事務

commit:提交事務

connection.setautocommit(boolean):設定事務是否自動提交,如果設定為true,自動提交,那麼每執行一條sql語句,就相當於執行乙個單獨的事務,就會自動提交,如果設定為false,那就相當於開啟了一條事務。

connection.commit():事務的提交。

connection.rollback():回滾事務。

try catch() {

con.rollback();//回滾事務

編寫測試sql指令碼,如下:

/* 建立資料庫 */createdatabase day16;use day16;

/* 建立賬戶表 */createtable account ( id int primary key auto_increment,  

namevarchar(40), moneyfloat) 

characterset utf8 collate utf8_general_ci;

/* 插入測試資料 */insertinto account(name,money)values('aaa',1000);

insertinto account(name,money)values('bbb',1000);insertinto account(name,money)values('ccc',1000);

下面我們在mysql資料庫中模擬aaa向bbb轉帳這個業務場景。

下面重點介紹一下事務的隔離級別.

1)併發問題

多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。

如果事務不考慮隔離性,可能會引發如下問題:

不可重複讀和幻讀的區別:

不可重複讀是讀取到了另一事務的更新

幻讀是讀取到了另一事務的插入(mysql中無法測試到幻讀)

幻讀/虛讀:事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到t2插入的記錄,這條新紀錄就是幻想。

不可重複讀取:事務t1讀取一行記錄,緊接著事務t2修改了t1剛剛讀取的記錄,然後t1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀。

髒讀:事務t1更新了一行記錄,還未提交所做的修改,這個t2讀取了更新後的資料,然後t1執行回滾操作,取消剛才的修改,所以t2所讀取的行就無效,也就是髒資料。

2)四種隔離級別

為了處理這些問題,sql標準定義了以下幾種事務隔離級別

1、未提交讀(read uncommitted)

事務中的修改及時沒提交也會被其他事務可見,這樣會產生髒讀,如果事務失敗回滾,則其他事務之前的到的資料則是髒資料。從效能上講,不會比別的事務提高太多,但是極其不安全。

2、讀提交(read committed)

又可叫不可重複讀,大多數資料庫預設的隔離模式(mysql不是)。在事務完成提交之前,其他事務看不到該事務的修改結果。執行兩次同樣的查詢可能看到不一樣的結果。

3、重複讀(repeatable read)

事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。事務a再讀取時,卻發現資料發生了變化。造成了幻讀。(mysql預設的隔離級別)

4、序列化(serializable)

serializable是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

**: 

資料庫事務

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

資料庫 事務

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

資料庫事務

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