mysql基礎_事務

蜀道,難發表於2023-04-28

定義

一個事務其實就是一個完整的業務邏輯,是一個最小的工作單元,不可再分,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。

例如:王五向趙六的賬戶上轉2000塊錢,王五的賬戶上少2000塊錢,趙六的賬戶上多2000塊錢,這個操作是一個最小的工作單元,要麼同時成功,要麼同時失敗。

只有insert,delete,update語句才跟事務有關,因為只有這些語句是資料庫表中資料進行增、刪、改的。

做某件事的時候,需要多條增刪改語句共同聯合起來才能完成,所以需要事務的存在。一個事務其實就是多條增刪改語句同時成功,或者同時失敗!

提交事務、回滾事務

事務是透過InnoDB儲存引擎來實現多條增刪改語句同時成功或者同時失敗的,InnoDB儲存引擎是提供用來記錄事務性活動的日誌檔案的。在事務的執行過程中,每一次的增刪改操作都會記錄到“事務性活動的日誌檔案”中。

定義

提交事務:清空事務性活動的日誌檔案,將資料全部徹底持久化到資料庫表中。提交事務標誌著事務的結束,並且是一種全部成功的結束。

回滾事務:將之前所有的增刪改操作全部撤銷,並且清空事務性活動的日誌檔案,回滾事務標誌著,事務的結束,並且是一種全部失敗的結束。

演示事務:

1.回滾事務:

image-20230428213258883

image-20230428213415374

2.提交事務

image-20230428213759756

image-20230428213943064

事務的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;

image-20230428210200846

設定事務隔離級別

語法:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |SERIALIZABLE };

事務隔離級別越高,資料越安全,但是效能越低。

相關文章