理解MYSQL事務以及隔離級

事務的概念

事務是一組原子性的SQL查詢語句,也可以被看做一個工作單元。如果數據庫引擎能夠成功地對數據庫應用所有的查詢語句,它就會執行所有查詢,如果任何一條查詢語句因爲崩潰或其他原因而無法執行,那麼所有的語句就都不會執行。也就是說,http://www.hlj163.com/,事務內的語句要麼全部執行,要麼一句也不執行。

例:將b表中符合條件的記錄搬移到a表中(相似語句已在命令提示行中測試)start transaction;//用start transaction語句開始一個事務insert into a select from b where ...;//將b表中符合條件的行記錄插入a表delete from b where ...;//將b表中符合條件的行記錄刪除commit; /rollback; //commit語句提交整個事務,永久地修改數據,rollback語句回滾整個事務,取消已做的修改//如果插入操作失敗,那麼刪除操作將不執行ACID測試

ACID:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)。一個有效的事務處理系統必須滿足相關標準。


a.原子性:一個事務必須被視爲一個單獨的內部“不可分”的工作單元,以確保整個事務要麼全部執行,要麼全部回滾。當一個事務具有原子性時,該事務絕對不會被部分執行,要麼完全執行,要麼根本不執行。
b.一致性:數據庫總是從一種一致性狀態轉換到另一種一致性狀態。在上述例子中,一致性確保了,即使插入或者刪除操作失敗了,數據庫也不會多出或者丟失記錄。因爲最終事務根本沒有被提交,任何事務處理過程中所做的數據改變,也不會影響到數據庫的內容。
c.隔離性:某個事務的結果只有在完成之後纔對其他事務可見。在上述例子中,當數據庫執行完insert語句,還未執行delete語句時,如果此時另一個客戶端對數據庫的訪問也同時運行,它將仍視符合條件的記錄在b表中。
d.持久性:一旦一個事務提交,事務所做的數據改變將是永久的。
這種事務處理中的額外安全措施,導致數據庫服務器要完成更多的額外工作。通常,一個支持ACID特性的數據庫,相對於不支持這種特性的數據庫,需要更強的CPU處理能力,更大的內存和更多的磁盤空間。這正是選用MYSQL存儲引擎架構的有利之處。用戶可以根據應用是否需要事務處理,選擇相應的存儲引擎。如果對於某些類型的數據查詢,用戶不需要真正的事務處理,他可以選擇一個非事務處理型的存儲引擎來實現查詢,以獲得更高的處理性能。(我們的數據庫選擇的存儲引擎是innoDB,支持事務處理,而mysql默認的存儲引擎是MyISAM引擎,不支持事務)

隔離級

SQL標準定義了4類隔離級,包括了一些具體規則,用來限定事務內外的哪些改變時可見的,哪些是不可見的。低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。

READ UNCOMMITTED(讀取未提交內容)

在READ UNCOMMITTED隔離級,所有事務都可以“看到”未提交事務的執行結果。在這種級別上,可能會產生很多問題。本隔離級很少用於實際應用,因爲它的性能也不比其他級別好多少,而別的級別還有其他更多的優點。讀取未提交數據,也被稱之爲“髒讀(Dirty Read)”

READ COMMITTED(讀取提交內容)

大多數數據庫系統的默認隔離級是READ COMMITTED(但這不是MYSQL默認的)。它滿足了隔離的早先簡單定義:一個事務在開始時,只能“看見”已經提交事務所做的改變,一個事務從開始到提交前,所做的任何數據改變都是不可見的,除非已經提交。這種隔離級別也支持所謂的“不可重複讀(Nonrepeatable Read)”。這意味着用戶運行同一語句兩次,看到的結果是不同的。

REPEATABLE READ(可重讀)

REPEATABLE READ 隔離級解決了READ UNCOMMITTED隔離級導致的問題。它確保同一事務的多個實例在併發讀取數據時,會“看到相同的”數據行。不過理論上,這會導致另一個棘手問題:幻讀(Phantom Read)。簡單來說,幻讀指當用戶讀取某一範圍的數據行時,哈爾濱網站製作公司,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影”行。InnoDB和Falcon存儲引擎通過多版本併發控制機制解決了幻讀問題。 REPEATABLE READ 是MYSQL的默認事務隔離級。InnoDB和Falcon存儲引擎都遵循這種設置。

SERIALIZABLE(可串行化)

SERIALIZABLE是最高級別的隔離級,它通過強制事務排斥,哈爾濱網站建設,使之不可能相互衝突,從而解決幻讀問題。簡言之,SERIALIZABLE是在每個讀的數據行上加鎖。在這個級別,可能導致大量的超時現象和鎖競爭現象。很少看到有用戶選擇這種隔離級。

注:不可重複讀與幻讀:不可重複讀的重點是修改(同樣的查詢條件,你讀取過的數據,再次讀取出來發現值不一樣了);幻讀的重點在於新增或者刪除(同樣的查詢條件,第1次和第2次讀出來的記錄數不一樣)

查看InnoDB系統級別的事務隔離級別:
mysql> SELECT @@global.tx_isolation;
查看InnoDB會話級別的事務隔離級別:
mysql> SELECT @@tx_isolation;
MySQL中的事務

AUTOCOMMIT(自動提交)

MySQL默認操作模式是AUTOCOMMIT模式。這意味着除非顯示地開始一個事務,否則它將把每個查詢視爲一個單獨事務自動執行。在當前連接中,可以通過變量設置,啓用和禁用AUTOCOMMIT模式。

mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT'; //高版本的mysql支持
mysql> select @@autocommit; //mysql5.0支持
如果設置AUTOCOMMIT=0,用戶將一直處於某個事務中,直到用戶執行一條COMMIT或ROLLBACK語句,之後,MYSQL將立即開始一個新事務。

在事務中混合使用存儲引擎

在一個事務中,如果混合使用事務性表和非事務性表,假如事務處理一切順利,那麼結果也會正常。但是,如果事務須回滾,那麼在非事務性表上做的修改將無法取消。這將導致數據庫處於數據不一致的狀態,在這種狀態下,很難對數據進行恢復,並且事務會變得懸而未決。

隱式和顯式鎖定

InnoDB使用二相鎖定協議(Two-Phase Locking Protocol兩段鎖協議)。一個事務在執行過程中的任何時候,都可以獲得鎖,但只有在執行COMMIT或ROLLBACK語句後,纔可以釋放這些鎖。它會同時釋放掉所有鎖。以上描述的鎖定機制都是隱式鎖定。InnoDB會根據用戶的隔離級別,自動處理鎖定。不過InnoDB也支持顯示鎖定



轉自:http://www.searchdatabase.com.cn/showcontent_58019.htm

發佈了12 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章