簡單的理解MySql 的事務隔離級別

2021-09-10 23:20:18 字數 2619 閱讀 3559

原子性:指事務是資料操作的最小單位,要麼全部執行,要麼全部都不執行。

一致性:指事務執行前後,資料保持一致。比如銀行轉賬,a有1000塊,b有500塊,a轉給b 500塊,事務執行完後,資料也就是金額的總數並沒有改變,加起來還是1500,只不過是a少了500,b多了500。

隔離性: 當多個執行緒都開啟事務運算元據庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性。

永續性:指事務對資料庫的操作是持久的,比如修改是永久生效的。

事務的隔離性是指在併發環境中,併發的事務是相互隔離的。sql標準中定義了四種資料庫事務隔離級別,級別從低到高分別為:讀未提交(read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)、序列化(serializable)。在事務的併發操作中會出現髒讀、不可重複讀、幻讀。在事務的併發操作中第二類更新丟失可以通過樂觀鎖和悲觀鎖解決。

四種隔離級別:

set tx_isolation='read-uncommitted';

1.未提交讀(隔離級別最低) : 會導致髒讀(未提交讀,事務t1在讀取資料時,沒有對資料加任何鎖,所以另外乙個事務t2也可以讀取並隨意修改,然後t1提交事務讀出來的資料是被t2修改過的)

set tx_isolation='read-committed';

2.已提交讀 :解決了髒讀,會導致不可重複讀(已提交讀,事務t1在讀取資料時會對資料加行共享鎖,事務t2此時也可以讀取此行資料,但是不能給這行資料加入排他鎖,事務t1在結束讀取時釋放了行共享鎖,此時t2可以加排他鎖,而t1不能對資料進行讀取修改,直到t2結束,如果t2進行了某種修改,就會導致第二次t1再查詢時,兩次查詢到的結果不同,這樣雖然解決了髒讀,但是會產生不可重複讀)

set tx_isolation='repeatable-read';

3.可重複讀 (mysql資料庫預設的隔離級別):  解決了不可重複讀,會導致幻讀(可重複讀,事務t1在讀取資料時會對資料加乙個共享鎖,直到事務結束提交後才會釋放共享鎖,這樣t2在t1執行過程中不能給資料加入排他鎖進行修改,從而避免了不可重複讀,但是會導致幻讀,因為可重複讀隔離級別加的是行共享鎖,比如查詢10行資料,會給那10行資料都加入共享鎖,但是表是 沒有加鎖的,事務t2此時雖然不能修改那10行資料,但是可以往10行資料所在的表裡插入新的符合t1查詢條件的資料,這樣t1再次執行查詢時會發現多了幾條資料,就是幻讀。

set tx_isolation='serializable';

4.序列化(隔離級別最高):   解決了髒讀,不可重複度,幻讀,但是會降低併發能力(序列化,事務t1在執行讀時會對資料所在的表新增表共享鎖,直到事務結束,在t1事務期間,t2只能讀取 這張表,但是不能進行其他的任何操作,寫操作也是一樣的,t1往表裡寫資料時同樣會對資料所在的表加上乙個表排他鎖直到事務結束)。序列化加的不是表鎖,還是行級鎖,

它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。通俗地講就是,假如兩個事務都操作到同一資料行,那麼這個資料行就會被鎖定,只允許先讀取/操作到資料行的事務優先操作,只有當事務提交了,資料行才會解鎖,後乙個事務才能成功操作這個資料行,否則只能一直等待

ps:共享鎖 share locks(s鎖)可以理解為讀鎖,排他鎖 exclusive locks(x鎖)可以理解為寫鎖。第乙個事務給資料加了共享鎖,第二個事務也能給這些資料加共享鎖來讀取資料,但是不能給他加排他鎖來進行寫操作,除非第乙個事務釋放了共享鎖,此時第二個事務才能加排他鎖來進行寫操作,s鎖和x鎖都屬於悲觀鎖。

樂觀鎖

在更新語句中增加過濾條件,進行版本的判斷,可以是這條記錄的版本號、更新時間等。然後通過影響行數來判斷是否更新成功。

悲觀鎖

共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,共享鎖是用來讀取資料的。另外,乙個事務獲取了同一資料的共享鎖,其他事務就不能獲取該資料的排它鎖。

排它鎖又稱為寫鎖,簡稱x鎖,顧名思義,排它鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排它鎖,其他事務就不能再獲取該行的其它鎖,包括共享鎖和排它鎖。另外不存什麼事務隔離級別,update/insert/delete會自動獲取排它

共享鎖獲取方式:select * from account where name='jack' lock in share mode;

排它鎖獲取方式:select * from account where name='jack' for update;

mysql分為表級鎖和行級鎖,共享鎖和排它鎖是行級鎖。

通常,對於絕大多數的應用程式來說,可以優先考慮將資料庫系統的隔離級別設定為讀已提交(read committed),這能夠在避免髒讀的同時保證較好的併發效能。儘管這種事務隔離級別會導致不可重複讀、幻讀和第二類丟失更新等併發問題,但較為科學的做法是在可能出現這類問題的個別場合中,由應用程式主動採用悲觀鎖或樂觀鎖來進行事務控制。

參考文章:事務隔離級別,髒讀、不可重複讀、幻讀,樂觀鎖、悲觀鎖

mysql事務隔離性的理解

事務是對一組操作原子性的保障,但正是由於事務,就會出現事務a和事務b資料之間的可見性問題 髒讀,幻讀,不可重複讀 為了解決問題,才設定了隔離級別這種東西 隔離級別的一種實現思想就是mvcc,一行資料由於多個事務的修改可能會有多個版本。每次讀取的是資料最新版本。事務之間不是併發執行的。事務在每次執行語...

mysql的事務隔離

在 mysql 中,事務支援是在引擎層實現的。mysql是乙個支援多引擎的系統,但並不是所有的引擎都支援事務,比如mysql原生的myisam引擎就不支援事務,這也是myisam被innodb取代的重要原因之一。事務acid 原子性 一致性 隔離性 永續性。atomicity consistency...

mysql事務隔離最高 Mysql事務隔離級別

mysql官方文件顯示 innodb中每個隔離級別的詳細描述如下 read uncommitted select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為 髒讀 dirty read 另外,這個隔離級別象read commit...