事務是由一組sql語句組成的邏輯處理單元,是滿足 acid 特性的一組操作,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。事務具有以下4個屬性,通常簡稱為事務的acid屬性:
事務b讀取到了事務a已修改但尚未提交的的資料,還在這個資料基礎上做了操作。此時,如果a事務回滾rollback
,b讀取的資料無效,不符合一致性要求。
在乙個事務內,多次讀同乙個資料。在這個事務還沒有結束時,另乙個事務也訪問該同一資料。那麼,在第乙個事務的兩次讀資料之間。由於第二個事務的修改,那麼第乙個事務讀到的資料可能不一樣,這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀,即原始讀取不可重複。
乙個事務t1按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務t2插入了滿足其查詢條件的新資料,這種現象就稱為「幻讀」。(和可重複讀類似,但是事務 t2 的資料操作僅僅是插入和刪除,不是修改資料,讀取的記錄數量前後不一致)
最低的隔離等級,允許其他事務看到沒有提交的資料,會導致髒讀。
被讀取的資料可以被其他事務修改,這樣可能導致不可重複讀。也就是說,事務讀取的時候獲取讀鎖,但是在讀完之後立即釋放(不需要等事務結束),而寫鎖則是事務提交之後才釋放,釋放讀鎖之後,就可能被其他事務修改資料。該等級也是 sql server 預設的隔離等級。
所有被 select 獲取的資料都不能被修改,這樣就可以避免乙個事務前後讀取資料不一致的情況。但是卻沒有辦法控制幻讀,因為這個時候其他事務不能更改所選的資料,但是可以增加資料,即前乙個事務有讀鎖但是沒有範圍鎖,為什麼叫做可重複讀等級呢?那是因為該等級解決了下面的不可重複讀問題。(引申:現在主流資料庫都使用 mvcc 併發控制,使用之後rr
(可重複讀)隔離級別下是不會出現幻讀的現象。)
mysql預設是repeatable-read
。
所有事務乙個接著乙個的執行,這樣可以避免幻讀 (phantom read),對於基於鎖來實現併發控制的資料庫來說,序列化要求在執行範圍查詢的時候,需要獲取範圍鎖,如果不是基於鎖實現併發控制的資料庫,則檢查到有違反序列操作的事務時,需回滾該事務。
Mysql事務與隔離級別
1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事務開始前和...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...