天天看點

MySQL事務

一、事務的四大基本要素:ACID

1、原子性(Atomicity)

事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滞在中間環節。事務執行過程中出錯,會復原到事務開始前的狀态,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本機關。通過undo log保證。

2、一緻性(Consistency)

事務開始前和結束後,資料庫的完整性限制沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

3、隔離性(Isolation)

同一時間,隻允許一個事務請求同一資料,不同的事務之間彼此沒有任何幹擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

4、持久性(Durability)

事務完成後,事務對資料庫的所有更新将被儲存到資料庫,不能復原。

二、事務的并發問題

以一個事務使用的常見常見為例,有兩個事務A和B,事務A中把version字段由1更新為2,事務B在事務A送出前後分别讀了兩次,在不同的事務隔離級别情況下,有不同的傳回結果。

髒讀

事務A讀取了事務B更新的資料,然後B事務復原,那麼事務A讀取的就是髒資料。

不可重複讀

事務A多次讀取同一資料,事務B在事務A多次讀取的過程中對資料進行了更新并送出,導緻事務A多次讀取同一資料的結果不一緻,叫做不可重複讀。

幻讀

系統管理者A将資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理者B就在這個時候插入了一條具體分數的記錄,當系統管理者A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結

不可重複讀和幻讀容易混淆,不可重複讀側重修改導緻,幻讀側重新增或删除。解決不可重複讀問題隻需要鎖住相關的行,解決幻讀需要鎖表。

三、事務隔離級别

事務隔離級别

讀未送出(read-uncommitted)

讀已送出(read-committed)

可重複讀(repeatable-read)

串行化(serializable)

四、實戰

背景知識:

檢視MySQL事務隔離級别:

mysql> show variables like 'transaction_isolation';

+-----------------------+-----------------+

| Variable_name | Value |

| transaction_isolation | REPEATABLE-READ |

1 row in set (0.00 sec)

修改MySQL事務隔離級别:

mysql> set session transaction isolation level read committed;

五、MVCC 多版本并發控制

MVCC,全稱Multi-Version Concurrency Control,即多版本并發控制。MVCC是一種并發控制的方法,一般在資料庫管理系統中,實作對資料庫的并發通路,在程式設計語言中實作事務記憶體。

五、總結

隔離級别越高,資料一緻性和隔離性越好,但是并發性能越差,是以要針對不同的場景設定合适的隔離級别。

參考

• https://www.cnblogs.com/huanongying/p/7021555.html