[toc]
## 一、事務定義
一個或一組SQL語句組成一個執行單元,這個執行單元要么全部執行,要么全部不執行。
## 二、事務的基本要素(ACID)
1.原子性(Atomicity):一個事務不可再分割,要么都執行要么都不執行
2.一致性(Consistency):一個事務執行會使數據從一個一致性狀態切換到另外一個一致性狀態
3.隔離性(Isolation):一個事物的執行不受其他事務的干擾
4.持久性(Durability):一個事務一旦提交,則會永久的改變數據庫的數據
## 三、事務的創建
1.隱式事務:事務沒有明顯的開啟和結束標記
例如:insert、update、delete語句
2.顯示事務:事務具有明顯的開啟和結束的標記
<b>開啟事務:set autocommit=0;
結束事務:commit;(提交事務) rollback;(回滾事務)</b>
在開始事務和結束事務中間填寫要執行的增、刪、改、查的操作(DML)。
## 四、事務的隔離級別

1.read uncommitted(讀未提交)
最低的隔離級別,一個事務可以讀取另一個事務未提交的更新結果。
2.read committed(讀提交)
大部分數據庫采用的默認隔離級別,一個事務的更新操作結果只在該事務提交之后,另一個事務才可以讀取到同一筆數據更新后的結果。
3.repeatable read(重復讀)
<b>mysql的默認級別</b>。整個事務過程中,對同一筆數據的讀取結果是相同的,不管其他事務是否在對共享數據進行更新,也不管跟新提交與否。
4.seriallizable(序列化)
最高隔離級別。所有事務操作一次順序執行。注意這會導致并發度下降,性能最差。通常會用其他并發級別加上相應的鎖的機制來取代它。
## 五、不同事務級別帶來的并發問題
### 1.臟讀

臟讀發生在一個事務A讀取了另一個事務B修改,但還是未提交的數據。如果加入B回退,則事務A讀取的就是無效數據。
### 2.不可重復讀

在上面這個例子中,事務2提交成功,它所做的修改已經可見。然而,事務1已經讀取了一個其它的值。在序列化和可重復讀的隔離級別中,數據庫管理系統會返回舊值,即在被事務2修改之前的值。在提交讀和未提交讀隔離級別下,可能會返回被更新的值,這就是“不可重復讀”。
有兩個策略可以防止這個問題的發生:
(1) 推遲事務2的執行,直至事務1提交或者回退。這種策略在使用鎖時應用。
(2) 而在多版本并行控制中,事務2可以被先提交。而事務1,繼續執行在舊版本的數據上。當事務1終于嘗試提交時,數據庫會檢驗它的結果是否和事務1、事務2順序執行時一樣。如果是,則事務1提交成功。如果不是,事務1會被回退。
### 3.幻讀

幻讀發生在當兩個完全相同的查詢執行時,第二次查詢所返回的結果集跟第一個查詢不相同。
發生的情況:沒有范圍鎖。