MySQL--事務,隔離性和隔離級別

 

事務

事務就是一組數據庫操作,要麼全部執行成功,要麼全部執行失敗,在MySQL中,事務是依靠存儲引擎層實現的。

 

ACID(Atomicity,Consistency,Isolation,Durability)

原子性是指事務是不可再分的,是最小的工作單元。

一致性是指數據的完整性必須保持一致。

隔離性則是指多個用戶併發訪問數據庫時,必須爲每個用戶開啓一個事務,這些事務相互之間不受影響相互隔離。

持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

四個特性之間不是平級關係:

1,只有滿足一致性,事務的執行結果纔是正確的,。

2,在無併發的情況下,事務串行執行,隔離性一定能夠滿足,此時只要能夠滿足原子性,那麼就一定能夠滿足一致性。

3,在併發的情況下,多個事務並行執行,事務不僅要滿足隔離性,還需要滿足隔離性,才能滿足一致性。

4,事務滿足持久化是爲了能應對系統崩潰的情況。

 

 

隔離級別

首先需要清楚的一點是,隔離得越嚴實,效率就會越低,因此許多時候是在這兩者時間找尋平衡點。

隔離級別包括以下四個:

讀未提交(READ UNCOMMITTED):是指一個事務未提交時,做的變更能被其他事務看到。

讀提交(READ COMMITTED):是指一個事務提交之後,做的變更能被其他事務看到。

可重複讀(REAPEATABLE READ):是指一個事務執行過程看到的數據,總是和這個事務啓動時看到的數據是一致的,並且,未提交的變更對於其他事務也是不可見的。

串行化(SERIALIZABLE):是指對於同一行記錄,寫會對其加寫鎖,讀會對其加讀鎖,當出現讀寫鎖衝突的時候,後訪問的事務必須等前一個事務完成才能繼續執行。這也是級別最高的隔離級別。

 

煮個栗子

先假設數據表T中只有一列,其中一行值爲1,那麼對於不同的隔離級別,表格中的V1V2V3的值就會有不同。

 

 

 

1,對於讀未提交,那麼B雖然沒有提交但是B做的修改可以被A看到,所以V1查出來是就是修改後的2了,那麼自然V2也是2,V3也是2;

2,對於讀提交,那麼B在沒提交之前做的修改A都是看不到的,所以V1仍然是1,但是在查V2之前B提交了,所以V2等於2,V3也等於2;

3,對於可重複讀,意味着一個事務執行期間看到的值都是一樣的,在啓動時查詢到的值爲1,那麼在A未提交前看到的都是1,所以V1V2都是1,V3爲2;

4,對於串行化,因爲A在B之前查詢到1,所以在B進行修改時,並不能繼續往下,而是必須等待A執行結束,所以V1V2都是1,V3爲2;

 

查詢自己數據庫的隔離級別:

SHOW VARIABLES LIKE 'transaction_isolation';

 

事務隔離的實現:

 

 

 在MySQL中,實際上每一條記錄在更新的時候都會同時記錄一條回滾的記錄,記錄上最新的值,通過回滾能找到前一個狀態下的值,在不同的時刻

啓動的事務就會有不同的read-view,同一條記錄在系統中可以存在很多個版本。煮個栗子:(圖片來自丁奇的MySQL45講)

從左往右看,就是1按順序被修改爲2,3,4,在回滾日誌中能看到上圖這樣的記錄,

 在視圖A,B,C裏面,此記錄的值是1,2,4。此時即使有另一個事務正在將4再改成5,這個事務跟read-viewA,B,C對應的事務不會衝突的。

詳細的原理本人還沒有進行深入瞭解,如果日後學到了再補上。

 

事務的啓動方式:

顯式啓動:start transaction/begin,配套提交語是commit,回滾是rollback

將自動提交關閉即set autocommit=0,意味着如果你執行一個select語句,這個事務就啓動了,並不會自動提交,直到手動commit或者rollback,

或者斷開連接。這種自然是不好的,因爲客戶端如果跟MySQL一直是長連接,那麼就導致長事務,長事務會導致系統裏面有許多老的事務視圖。

且這些事務視圖可以訪問數據庫中的任何數據,事務提交之前的所有的回滾記錄都會得到保留,佔用大量存儲空間。除此之外,長事務也佔用

鎖資源,對庫的性能有很大影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章