標籤:mysql 隔離等級
Mysql中的事務
事務是DBMS中的執行單位,它是有限的資料庫操作序列組成的。但是並不是所有的資料庫操作序列都能成為事務。一般說來,事務具有如下4個特性(ACID特性):
1、原子性(Automicity):該特性引起的資料庫操作"要麼全部執行,要麼全部不執行"。
2、一致性(Consistency):該特性表示資料庫操作之前和操作之後的最終狀態是一致的。比如,兩個使用者a,b之間相互轉賬,但是最終兩個使用者的總金額是不變的。
3、隔離性(Isolation):多個事務並發執行時,各個事務獨立執行,且各個事務之間的影響最小。
4、持久性(Durability):一旦事務提交執行成功,則系統保證在任何故障下,事務都不會引起不一致性。
mysql中的髒讀、不可重複讀取和幻讀的概念
髒讀:在Read-Uncommitted隔離等級下的當前事務中可以讀到其他事務還沒有提交的資料 。
不可重複讀取(non-repeatable reads):在當前事務中,且未提交,且其他事務在修改相關資料時,兩次查詢的結果不一樣,就叫做不可重複讀取。
幻讀:就是當前同一個事務在未提交和提交後的結果不一樣。感覺像幻像一樣。
mysql中隔離等級分為4種:
1、Read-Uncommited:讀未提交。該隔離等級下的當前事務可以看到其他未提交事務的執行結果。在該層級下會出現髒讀現象。
2、Read-Committed:讀提交。解決了髒讀的問題。在該隔離等級下,當前事務只能看到其他事務提交後的執行結果。因此該隔離等級支援不可重複讀取。大多數資料庫的的預設隔離等級為Read-Committed,但是mysql不是的。
3、Repeatable-Read:重複讀。解決了不可重複讀取的問題。在該層級且當前事務沒有提交的前提下,不管其他事務如何修改資料,每次查詢的結果都是一樣的。一旦當前事務提交,則查詢的結果就是最新的結果。因此會出現幻讀的現象。事務提交前和提交後的結果不一樣。在該層級下,為了提高並發能力,需要藉助MVCC(多版本並發控制)機制來完成。這是mysql的預設隔離等級。
4、Serializable:可序列化。就是事務接著一個一個的串列執行,只有同一個執行個體下的其他事務結束後,才可以執行同一個執行個體下的另一個事務。這樣就解決了幻讀的問題。
總結:mysql的四種預設隔離等級所出現的讀取方式:
1、Read-Uncommitted:會出現髒讀、不可重複讀取等現象。
2、Read-Committed:會出現不可重複現象。
3、Repeatable-Read:會出現幻讀現象。
4、Serializable:不會出現髒讀、不可重複讀取、幻讀等現象。
由此可見,隔離等級越高,所受到的幹擾越小,消耗系統的資源越多。且最重要的是它們的並發效能越差。
mysql處理事務由2種方法:
1、手動執行事務
mysql>begin; 或mysql>start transaction; ##表示啟動事務
mysql>rollback; ##撤銷之前所做的修改(復原)
mysql>commit; ##提交事務
2、設定事務的自動認可模式
mysql>select @@autocommit; ##查看當前事務是否是自動認可的。0或off表示關閉自動認可;1或on表示開啟自動認可
set autocommit=0 ##關閉自動認可功能(只能用於當前會話,這是修改的會話變數)
set autocommit=1 ##開啟自動認可功能(只能用於當前會話,這是修改的會話變數)
mysql中隔離等級的設定:
mysql>select @@tx_isolation; ##顯示當前的隔離等級
mysql>set tx_isolation=‘VALUE‘ ##用來設定隔離等級
事務的執行狀態:共有5種狀態
1、active:表示當前事務進行中當中
2、部分提交的:表示語句在執行過程中,由於某種原因(如宕機)導致只執行了一部分。因此事務就處於該狀態下。
3、失敗:表示事務沒有執行成功。
4、終止:由於事務執行失敗,因此系統會終止該事務
5、提交成功:表示提交後,事務執行成功。
本文出自 “linux學習之路” 部落格,請務必保留此出處http://xslwahaha.blog.51cto.com/4738972/1581558
mysql的事務和隔離等級詳解