資料儲存 MySQL之掌握事務隔離

2021-10-11 07:48:45 字數 2376 閱讀 7914

automicity(原子性):整個事務的所有操作,或者全部完成,或者全部不完成,不會出現完成一部分的情況。事務在執行過程中發生錯誤,會被回滾(roll back)到開始前的狀態,就像這個事務沒有執行過一樣。

consistency(一致性):乙個事務可以封裝狀態改變(除非它是乙個唯讀的)。事務必須始終保持系統處於一致的狀態,不管在任何給定的時間併發事務有多少。

isolation(隔離性):隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。

durability(永續性):在事務完成以後,該事務對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。

髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料

不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果不一致。

幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

read uncommitted:讀未提交。對修改的項加排它鎖,直到事務結束釋放;沒有快照讀,只能讀到最新版本的資料,讀取資料不需要加共享鎖,這樣就不會跟被修改的資料上的排它鎖衝突。

read committed:讀已提交。對修改的項加排它鎖,直到事務結束釋放;有快照讀,快照的粒度是語句級,讀操作需要加共享鎖,但是語句執行完以後釋放共享鎖。

repeatable read:可重複讀。對修改的項加排它鎖,直到事務結束釋放;有快照讀,快照的粒度是事務級,讀操作需要加共享鎖,但是在事務提交之前並不釋放共享鎖,只有等事務結束才會釋放共享鎖。

serializable:序列化,限制性最強的隔離級別,該級別鎖定整個操作範圍,並一直持有鎖,直到事務結束。

查詢當前事務隔離級別:select @@tx_isolation;

切換當前事務隔離級別為讀未提交:set session transaction isolation level read uncommitted;

切換當前事務隔離級別為讀已提交:set session transaction isolation level read committed;

切換當前事務隔離級別為可重複讀:set session transaction isolation level repeatable read;

切換當前事務隔離級別為序列化:set session transaction isolation level serializable;

查詢會看到在該時間點之前提交的事務所做的更改,而不會看到稍後或未提交的事務所做的更改。此規則的例外情況是,查詢可以看到同一事務中先前語句所做的更改。

如果事務隔離級別是repeatable read(預設級別),那麼同一事務中的所有一致讀取都將讀取該事務中第乙個這樣的讀取所建立的快照。通過提交當前事務,然後再發出新的查詢,可以為查詢獲得更近的快照。

使用read committed隔離級別,事務中的每個一致讀取都將設定並讀取自己的新快照。

一致性讀是innodb在read committed和repeatable read隔離級別處理select語句的預設模式。一致讀不會對其訪問的表設定任何鎖,因此,在對錶執行一致讀取的同時,其他會話可以自由修改這些表。

假設您在預設的可重複讀取隔離級別下執行。當您執行一致性讀(也就是說,乙個普通的select語句)時,innodb會給您的事務乙個時間點,根據這個時間點查詢資料庫。如果另乙個事務在指定時間點後刪除一行並提交,則不會看到該行已被刪除。插入和更新的處理方式類似。

用於update語句的一種讀操作,它是讀已提交和一致性讀的組合。

如果讀到一行已經加鎖的記錄,此時innodb返回記錄最近提交的版本,由mysql上層判斷此版本是否滿足update的where條件。若滿足(需要更新),則mysql會重新發起一次讀操作,此時會讀取行的最新版本(並加鎖)。

只有innodb_locks_unsafe_for_binlog引數設定為true,且處於read commited隔離級別下才會使用。

用於鎖定資料,防止其他事務對其修改。

鎖讀有兩種:

select... for share:為滿足條件的記錄設定共享鎖,其他事務仍然可以讀,但是在本事務提交之前是不可以修改的,如果當前記錄正在被其他事務修改,且尚未提交,則等到占用事務結束。在8.0.22之前,需要select許可權與delete、lock tables、update中至少乙個許可權,從8.0.22開始,只需要select許可權就可以使用,鎖會在事務結束的時候釋放。

select...for update:鎖定滿足條件的記錄和任何相關聯的索引項,其他事務被禁止更新該記錄,無法執行select...for share。需要select許可權與delete、lock tables、update中至少乙個許可權。只有autocommit被禁用才會生效。

資料儲存 MySQL之InnoDB實現事務

redo log是物理格式上的innodb日誌,記錄儲存引擎為innodb的資料庫中每個頁的修改。redo log包括兩個部分 1.記憶體中的日誌緩衝 redo log buffer 因為處於記憶體中,所以這部分日誌內容是容易丟失的。2.磁碟上的重做日誌檔案 redo log file 這部分日誌是...

資料庫事務的隔離級別和MySql事務的隔離級別

髒讀是指,乙個事務的處理過程中讀取到了另乙個未提交的事務中的資料。不可重複讀指,在乙個範圍內,多次查詢去返回了不同的資料值,這是由於在查詢間隔,被另乙個事務修改並提交了。虛讀 幻讀 指,乙個事務對一批資料的name欄位做出全部修改後 將該字段的值從a改為b 未提交事務 此時另乙個事務又新增了一條資料...

Mysql 事務隔離級別 InnoDB實現隔離機制

在read uncommitted級別中,事務所做的寫操作,即使沒有提交,對其他事務也是可見的,a事務可以讀取b事務未提交的資料,這就叫做未提交讀 髒讀。這個級別會導致很多問題,但從效能上來說,並不比其他級別好太多。大部分資料庫系統的預設隔離級別就是 read committed,它解決了髒讀的問題...