1. 程式人生 > >分散式事務(一)事務的隔離級別

分散式事務(一)事務的隔離級別

事務的ACID

**Atomic:**原子性,一堆SQL,要麼都成功,要麼都不執行,不允許一部分SQL執行成功,一部分SQL執行失敗。

**Consistency:**一致性,在一堆SQL執行之前,資料必須是正確的,執行之後,資料也必須是準確的。

**Isolation:**隔離性,多個事務在跑的時候不能互相干擾,不要事務A操作資料還未完成,事務B也來操作這個資料,導致事務A的操作出錯。

**Durability:**永續性,事務成功了,就必須永久對資料的修改是有效的,不能過一段時間資料自己就沒了。

事務隔離級別

**讀未提交(Read Uncommitted):**某個事務還沒提交的時候,修改的資料,就讓別的事務給讀到了,這很容易導致出錯的,這個也叫做髒讀。
讀未提交

**讀已提交(Read Committed 不可重複讀):**事務A在跑的時候, 先查詢了一個數據是值1,然後過了段時間,事務B把那個資料給修改為2還提交了,此時事務A再次查詢這個資料就成了值2了。這個也叫做不可重複讀,就是所謂的一個事務內對一個數據兩次讀,可能會讀到不一樣的值。
讀已提交

**可重複讀(Read Repeatable):**事務A在執行過程中,對某個資料的值,無論讀多少次都是值1;哪怕這個過程中事務B修改了資料的值還提交了,但是事務A讀到的還是自己事務開始時這個資料的值。
可重複讀

**幻讀:**不可重複讀和可重複讀都是針對兩個事務同時對某條資料在修改,幻讀針對的是插入,比如某個事務把所有行的某個欄位都修改為了2,結果另外一個事務插入了一條資料,那個欄位的值是1。第一個事務會突然發現多出來一條資料,那個資料的欄位是1。如果要解決幻讀,就需要使用序列化級別的隔離級別,所有事務都序列起來,不允許多個事務並行操作。
幻讀

序列化:
序列化

Mysql的隔離級別實現原理

MySQL的預設隔離級別是可重複讀(Read Repeatable),就是說每個事務都會開啟一個自己要操作的某個資料的快照,事務期間,讀到的都是這個資料的快照,對一個數據的多次讀都是一樣的。

實現原理:多版本併發控制(multi-version concurrency control)

innodb儲存引擎,會在每行資料的最後加兩個隱藏列,一個儲存行的建立時間,一個儲存行的刪除時間,但是這存放的不是時間,而是事務id,事務id是mysql自己維護的自增的,全域性唯一。

滿足:建立事務id <= 當前事務id,當前事務id < 刪除事務id。

Mysql事務隔離級別
事務id=121的事務,查詢id=1,得到name=張三的資料。

事務id=123的事務,查詢id=1,不能得到name=張三的資料。

事務id=121的事務,查詢id=2,得到name=李四的資料。

事務id=124的事務,查詢id=2,得到name=小李四的資料。