MYSQL中的事務

2021-08-03 12:30:59 字數 2092 閱讀 4781

innodb儲存引擎提供事務的隔離級別有read uncommitted、read committed、repeatable read和serializable。這些隔離級別之間的區別如下:

隔離級別

髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

未提交讀(read uncommitted)

可能可能

可能已提交讀(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能可序列化(serializable )

不可能不可能

不可能髒讀:乙個事務讀取到了另外乙個事務沒有提交的資料;比如:事務t1更新了一行記錄的內容,但是並沒有提交所做的修改。事務t2讀取到了t1更新後的行,然後t1執行回滾操作,取消了剛才所做的修改。現在t2所讀取的行就無效了;

不可重複讀:在同一事務中,兩次讀取同一資料,得到內容不同;比如:事務t1讀取一行記錄,緊接著事務t2修改了t1剛才讀取的那一行記錄(t2的事務已經提交了)。然後t1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為「不可重複」讀,因為t1原來讀取的那行記錄已經發生了變化;

幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同;比如:事務t1讀取一條指定的where子句所返回的結果集。然後事務t2新插入一行記錄,這行記錄恰好可以滿足t1所使用的查詢條件中的where子句的條件。然後t1又使用相同的查詢再次對錶進行檢索,但是此時卻看到了事務t2剛才插入的新行。這個新行就稱為「幻像」,因為對t1來說這一行就像突然出現的一樣。

不可重複讀和幻讀的區別

兩者都表現為兩次讀取的結果不一致.但是對於前者, 只需要鎖住滿足條件的記錄;對於後者, 要鎖住滿足條件及其相近的記錄

避免不可重複讀需要鎖行

避免幻影讀則需要鎖表

很多人容易搞混不可重複讀和幻讀,確實這兩者有些相似。但不可重複讀重點在於update和delete,而幻讀的重點在於insert。

如果使用鎖機制來實現這兩種隔離級別,在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖,其它事務無法修改這些資料,就可以實現可重複讀了。

但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。需要serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低資料庫的併發能力。

所以說不可重複讀和幻讀最大的區別,就在於如何通過鎖機制來解決他們產生的問題。

上文說的,是使用悲觀鎖機制來處理這兩種問題,但是mysql、oracle、postgresql等成熟的資料庫,出於效能考慮,都是使用了以樂觀鎖為理論基礎的mvcc(多版本併發控制)來避免這兩種問題。

- 悲觀鎖

正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機 制,也無法保證外部系統不會修改資料)。

在悲觀鎖的情況下,為了保證事務的隔離性,就需要一致性鎖定讀。讀取資料時給加鎖,其它事務無法修改這些資料。修改刪除資料時也要加鎖,其它事務無法讀取這些資料。

- 樂觀鎖

相對悲觀鎖而言,樂觀鎖機制採取了更加寬鬆的加鎖機制。悲觀鎖大多數情況下依靠資料庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是資料庫效能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。

而樂觀鎖機制在一定程度上解決了這個問題。樂觀鎖,大多是基於資料版本( version )記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 「version」 欄位來實現。讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如 果提交的資料版本號大於資料庫表當前版本號,則予以更新,否則認為是過期資料。

mysql中事務的特性 mysql中事務的四大特性

原子性 atomicity 事務就像 原子 一樣,不可被分割,組成事務的dml操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。一致性 consistency 一旦事務完成,不管是成功的,還是失敗的,整個系統處於資料一致的狀態。隔離性 isolation 乙個事務的執行不會被另乙個事...

mysql中的事務和鎖 MySQL中的事務和鎖

鎖 行級鎖select for update nowaitfalse,skip false 注意必須用在事物裡面 所有匹配的行將被鎖定,知道事務結束。這意味著可以通過鎖防止資料被其他事務修改。一般情況下如果其他事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。事務事務的四大特性 1.原子性 事務包...

MySql中的事務

一.mysql的事務支援不是繫結在mysql伺服器本身,而是與儲存引擎相關 1.myisam 不支援事務,用於唯讀程式提高效能 2.innodb 支援acid事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...