天天看點

MySQL基礎07-事務

一、簡介

MySQL提供了兩種事務型的存儲引擎:InnoDB和NDB Cluster。另外還有一些第三方存儲引擎也支援事務,比較知名的包括XtraDB和PBXT。

事務的4大特性ACID。ACID表示原子性、一緻性、隔離性和持久性。一個很好的事務處理系統,必須具備這些标準特性。

二、事務的ACID特性

1、原子性(Atomicity)

一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部送出成功,要麼全部失敗復原。

2、一緻性(consistency)

資料庫總是從一個一緻性的狀态轉換到另一個一緻性的狀态。(其實原子性和隔離性間接的保證了一緻性)

3、隔離性(isolation)

通常來說,一個事務所做的修改在最終送出以前,對其他事務是不可見的。後面我們讨論隔離級别(Isolation level)的時候,會發現為什麼我們要說“通常來說”是不可見的。

4、持久性(durability)

一旦事務送出,則其所做的修改就會永久儲存到資料庫中。

三、隔離級别

而我們最常說的隔離性其實有對應的隔離級别,MySQL規定的隔離級别有4種,分别是:

1、READ UNCOMMITTED(讀未送出)

在此級别裡,事務的修改,即使沒有送出,對其他事務也都是可見的。事務可以讀取未送出的資料,也就是會産生髒讀(Dirty Read),在實際應用中一般很少使用。

2、READ COMMITTED(讀已送出)

大多數資料庫系統的預設隔離級别都是它(但是MySQL不是),它能夠避免髒讀問題。這個級别有時候也叫做不可重複讀(nonrepeatable read),因為再次執行相同的查詢,可能會得到不一樣的結果。

3、REPEATABLE READ(可重複讀)

該隔離級别是MySQL預設的隔離級别,該級别保證了在同一個事務中多次讀取同樣記錄的結果是一緻。但是理論上,可重複讀隔離級别還是無法解決另外一個幻讀(Phantom Read)的問題。(注:這裡說的無法解決是MySQL定義層面,對于InnoDB引擎則完美的解決了幻讀的問題,如果你正在使用InnoDB引擎,可忽略)

4、SERIALIZABLE(可串行化)

該隔離級别是級别最高的,它通過鎖來強制事務串行執行,避免了前面說的所有問題。在高并發下,可能導緻大量的逾時和鎖争用問題。實際應用中也很少用到這個隔離級别,因為RR級别解決了所有問題。

注:執行

select @@global.tx_isolation

,可以确定資料庫的隔離級别。
MySQL可以通過執行

SET TRANSACTION ISOLATION LEVEL

指令來設定隔離級别。新的隔離級别會在下一個事務開始的時候生效。可以在配置檔案中設定整個資料庫的隔離級别,也可以隻改變目前會話的隔離級别:

mysql > SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

參考

1、《高性能MySQL》 [美]Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko 著

2、 蹲廁所的熊:談談MySQL-InnoDB存儲引擎事務的ACID特性

備用位址:https://view.inews.qq.com/a/20180427G1I97X00

繼續閱讀