1. 程式人生 > >Mysql——事物

Mysql——事物

1.什麼是事物

簡單的說,事物是一組sql語句。 它有三個狀態:

  1. 初始狀態
  2. 回滾(rollback)
  3. 提交(commit)

2.什麼是事物的ACID特性

1,原子性:事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。 2,一致性: 3,隔離性 : 4,永久性

3.事物的併發問題

1、髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料

2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。

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

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

4.事物的隔離級別有哪些

  1. Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

  2. Read committed (讀已提交):可避免髒讀的發生。

  3. Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

  4. Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。

     		  髒讀 		不可重複讀	 幻讀
    讀未提交		*			*			*
    讀已提交					*			*
    已重複讀								*
    序列化
    

隔離級別越高,併發性越差,安全性越好。

修改與查詢MySQL事務隔離級別的方法:

#查全域性事務隔離級別
SELECT @@global.tx_isolation;
#查當前會話事務隔離級別
SELECT @@session.tx_isolation; 
#查當前事務隔離級別
SELECT @@tx_isolation;
#設定全域性隔離級別
set global transaction isolation level read committed;
#設定當前會話隔離級別
set session transaction isolation level read committed;

5.事物的隔離級別怎麼實現的?鎖機制?

當有事務操作時,資料庫引擎會要求不同型別的鎖定,如相關資料行、資料頁或是整個資料表,當鎖定執行時,會阻止其他事務對已經鎖定的資料行、資料頁或資料表進行操作。只有在當前事務對於自己鎖定的資源不在需要時,才會釋放其鎖定的資源,供其他事務使用。 共享鎖(Share)

共享鎖的代號是S,共享鎖的鎖粒度是行或者元組(多個行)。一個事務獲取了共享鎖之後,可以對鎖定範圍內的資料執行讀操作。

排它鎖(eXclusive)

排它鎖的代號是X,是eXclusive的縮寫,排它鎖的粒度與共享鎖相同,也是行或者元組。一個事務獲取了排它鎖之後,可以對鎖定範圍內的資料執行寫操作。

意向鎖

意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。 簡單的說就是我要對哪個表進行事務操作了,就給哪個表加一個意向鎖。

MVCC機制

1.1 什麼是MVCC

MVCC是一種多版本併發控制機制。

1.2 MVCC是為了解決什麼問題?

大多數的MYSQL事務型儲存引擎,如,InnoDB,Falcon以及PBXT都不使用一種簡單的行鎖機制.事實上,他們都和MVCC–多版本併發控制來一起使用. 大家都應該知道,鎖機制可以控制併發操作,但是其系統開銷較大,而MVCC可以在大多數情況下代替行級鎖,使用MVCC,能降低其系統開銷.

1.3 MVCC實現

MVCC是通過儲存資料在某個時間點的快照來實現的. 不同儲存引擎的MVCC. 不同儲存引擎的MVCC實現是不同的,典型的有樂觀併發控制和悲觀併發控制.

2.MVCC 具體實現分析

下面,我們通過InnoDB的MVCC實現來分析MVCC使怎樣進行併發控制的. InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現的,這兩個列,分別儲存了這個行的建立時間,一個儲存的是行的刪除時間。這裡儲存的並不是實際的時間值,而是系統版本號(可以理解為事務的ID),沒開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的ID.下面看一下在REPEATABLE READ隔離級別下,MVCC具體是如何操作的.