1. 程式人生 > >Mysql之事務(一)

Mysql之事務(一)

概念

	事務就是一組原子性的SQL查詢,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料應用該組查詢的全部語句,那麼就執行該組查詢。如果其中任何一條語句因為崩潰或其他原因無法執行,那麼所有語句都不會執行。也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。

事務特性(ACID)

	1.原子性(atomicity):一個事務必須視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。
	2.一致性(consistency):事務前後資料的完整性必須保持一致,這是說資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性。
	3.隔離性(isolation):一個事務所做的修改在最終提交以前,對其他事務是不可見的。
	4.永續性(durability):一旦事務提交,則其所做的修改就會永久儲存到資料庫中。此時即使系統崩潰,修改的資料也不會丟失。

事務併發產生的問題

	1.第一類丟失更新
	在沒有事務隔離的情況下,兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出, 導致對資料的兩個修改都失效了。
	例如:
	張三的工資為5000,事務A中獲取工資為5000,事務B獲取工資為5000,匯入100,並提交資料庫,工資變為5100,隨後事務A發生異常,回滾了,恢復張三的工資為5000,這樣就導致事務B的更新丟失了。
	2.髒讀:髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。
	例如:
	張三的工資為5000,事務A中把他的工資改為8000,但事務A尚未提交。與此同時,事務B正在讀取張三的工資,讀取到張三的工資為8000。隨後事務A發生異常,而回滾了事務。張三的工資又回滾為5000。最後,事務B讀取到的張三工資為8000的資料即為髒資料,事務B做了一次髒讀。
	3.不可重複讀:是指在一個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也訪問該同一資料。那麼,在第一個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。
	例如:
	在事務A中,讀取到張三的工資為5000,操作沒有完成,事務還沒提交。與此同時,事務B把張三的工資改為8000,並提交了事務。隨後在事務A中,再次讀取張三的工資,此時工資變為8000。在一個事務中前後兩次讀取的結果並不致,導致了不可重複讀。
	4.第二類丟失更新:不可重複讀的特例。
	有兩個併發事務同時讀取同一行資料,然後其中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。
	例如:
	在事務A中,讀取到張三的存款為5000,操作沒有完成,事務還沒提交。與此同時,事務B,儲存1000,把張三的存款改為6000,並提交了事務。隨後,在事務A中,儲存500,把張三的存款改為5500,並提交了事務,這樣事務A的更新覆蓋了事務B的更新。
	5.幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣。
	例如:
	目前工資為5000的員工有10人,事務A讀取所有工資為5000的人數為10人。此時,事務B插入一條工資也為5000的記錄。這時,事務A再次讀取工資為5000的員工,記錄為11人。此時產生了幻讀。
	提醒:
	不可重複讀的重點是修改,同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了幻讀的重點在於新增或者刪除,同樣的條件,第 1 次和第 2 次讀出來的記錄數不一樣。