定義
一個事務其實就是一個完整的業務邏輯,是一個最小的工作單元,不可再分,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。
例如:王五向趙六的賬戶上轉2000塊錢,王五的賬戶上少2000塊錢,趙六的賬戶上多2000塊錢,這個操作是一個最小的工作單元,要麼同時成功,要麼同時失敗。
只有insert,delete,update語句才跟事務有關,因為只有這些語句是資料庫表中資料進行增、刪、改的。
做某件事的時候,需要多條增刪改語句共同聯合起來才能完成,所以需要事務的存在。一個事務其實就是多條增刪改語句同時成功,或者同時失敗!
提交事務、回滾事務
事務是透過InnoDB儲存引擎來實現多條增刪改語句同時成功或者同時失敗的,InnoDB儲存引擎是提供用來記錄事務性活動的日誌檔案的。在事務的執行過程中,每一次的增刪改操作都會記錄到“事務性活動的日誌檔案”中。
定義
提交事務:清空事務性活動的日誌檔案,將資料全部徹底持久化到資料庫表中。提交事務標誌著事務的結束,並且是一種全部成功的結束。
回滾事務:將之前所有的增刪改操作全部撤銷,並且清空事務性活動的日誌檔案,回滾事務標誌著,事務的結束,並且是一種全部失敗的結束。
演示事務:
1.回滾事務:
2.提交事務
事務的ACID 特性
原⼦性(Atomicity)
事務是⼀個原⼦操作,要麼全部提交,要麼全部回滾。當⼀個事務執⾏期間發⽣故障,作業系統會⾃動將其回滾到事務執⾏之前的狀態,保證資料的⼀致性。
⼀致性(Consistency)
事務執⾏結束後,資料必須保持⼀致性狀態。在事務執⾏期間,資料庫中的資料可以處於中間狀態,但在事務完成時必須保證資料的⼀致性。
隔離性(Isolation)
資料庫系統必須保證事務之間相互隔離,不會互相⼲擾。隔離級別不同,會影響到事務的併發性和資料⼀致性,⽐如出現髒讀、不可重複讀、幻讀等問題。
永續性(Durability)
⼀旦事務提交,其所做的修改必須永久儲存到資料庫中。即使系統發⽣故障或當機,資料也能夠保持不變。
事務的隔離級別
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
Read uncommitted(讀未提交) | √ | √ | √ |
Read committed (讀提交) | × | √ | √ |
Repeatable Read(可重複讀取,預設) | × | × | √ |
Serializable(可序化) | × | × | × |
讀未提交(READ UNCOMMITTED)
在讀未提交隔離級別下,事務 A 可以讀取到事務 B 修改過但未提交的資料。可能發生髒讀、不可重複讀和幻讀問題,一般很少使用此隔離級別。這種隔離級別一般都是理論上的,大多數的資料庫隔離級別都是二檔起步!
讀已提交(READ COMMITTED)
在讀已提交隔離級別下,事務 B 只能在事務 A 修改過並且已提交後才能讀取到事務 B 修改的資料。讀已提交隔離級別解決了髒讀的問題,但可能發生不可重複讀和幻讀問題
可重複讀(REPEATABLE READ)
在可重複讀隔離級別下,事務 B 只能在事務 A 修改過資料並提交後,自己也提交事務後,才能讀取到事務 B 修改的資料。可重複讀隔離級別解決了髒讀和不可重複讀的問題,但可能發生幻讀問題。mysql中預設的事務隔離級別就是這個
可序列化(SERIALIZABLE)
這是最高隔離級別,效率最低。解決了所有的問題。每一次讀取到的資料都是最真實的。
髒讀
一個事務讀到另一個事務還沒有提交的資料
不可重複讀
一個事務先後讀取同一條記錄,但兩次讀取的資料不同,稱為不可重複讀
幻讀
一個事務按照條件查詢資料時,沒有對應的資料行,但是在插入資料時,又發現這行資料已經存在,好像出現了“幻影”
檢視當前會話隔離級別
SELECT @@transaction_isolation;
設定事務隔離級別
語法:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |SERIALIZABLE };
事務隔離級別越高,資料越安全,但是效能越低。