事務 髒讀 不可重複讀 幻影讀的分析

2021-09-06 15:11:19 字數 929 閱讀 6000

1 丟失修改

2 髒讀:當事務1修改了一條記錄,沒有提交時,事務2讀取了該記錄;當事務1回滾了,那麼事務2的記錄就是一條不存在的記錄;

3 不可重複讀:當事務1讀取了一條記錄,未提交事務,事務2修改了該條記錄並且提交事務;事務1又讀取了該條記錄,發現兩條記錄不一樣;

4 幻影讀:當事務1根據某種檢索條件讀取了若干條記錄,未提交事務;而事務2又插入了一條記錄,該記錄也符合事務1的檢索條件;那麼當事務1在根據相同查詢條件檢索資料時候,出現了不一致的現象。

根據鎖機制來避免上訴問題:

排他鎖:資料加鎖後,只有鎖的擁有者可以對該資料進行修改和讀取,其他使用者不能做任何操作,也不能加鎖

共享鎖:資料加鎖後,所有使用者都可以讀取該物件,但是不能修改之,其他使用者也可以加共享鎖

處理以上隔離級別的問題,採用如下方是:

1 處理丟失修改,採用read_uncommitted。

2 處理髒讀:採用read_committed,修改時加排他鎖,直到事務提交後才釋放,讀取時加共享鎖,讀取完釋放

事務1讀取資料時加上共享鎖後(這樣在事務1讀取資料的過程中,其他事務就不會修改該資料),不允許任何事物操作該資料,只能讀取,之後1如果有更新操作,那麼會轉換為排他鎖,其他事務更無權參與進來讀寫,這樣就防止了髒讀問題。但是當事務1讀取資料過程中,有可能其他事務也讀取了該資料,讀取完畢後共享鎖釋放,此時事務1修改資料,修改完畢提交事務,其他事務再次讀取資料時候發現資料不一致,就會出現不可重複讀問題,所以這樣不能夠避免不可重複讀問題。

3 處理不可重複讀:讀採用repeatableread,取資料時加共享鎖,寫資料時加排他鎖,都是事務提交才釋放鎖。讀取時候不允許其他事物修改該資料,不管資料在事務過程中讀取多少次,資料都是一致的,避免了不可重複讀問題

4處理幻影讀問題:用serializable,採用的是範圍鎖ranges ranges_s模式,鎖定檢索範圍為唯讀,這樣就避免了幻影讀問題。

事務 髒讀 不可重複讀 幻讀

建立db8資料庫 create database db8 使用db8資料庫 use db8 建立賬戶表 create table account id int primary keyauto increment 賬戶id name varchar 20 賬戶名稱 money double 賬戶餘額 ...

事務以及髒讀 幻讀 不可重複讀

事務 是指資料庫中的一連串的連續操作,而且這一系列連續的操作要麼全部執行成功,要麼全部執行不成功。具有著原子性。事務的特點 1,原子性 要麼都執行成功,要麼都不成功 2,一致性 3,隔離性 不同的事務不知道對方的執行過程以及執行到了什麼程度 4,永續性 每個事務執行完畢必然會對資料庫進行資料的持久化...

髒讀,不可重複讀,幻讀

髒讀,不可重複讀,幻讀是由於資料庫事務的隔離性導致的問題。髒讀 乙個事務讀取到了其它未提交事務操作的記錄。不可重複讀 乙個事務a內,首次查詢到一條相同記錄,然後事務b修改該條記錄並提交,事務a再次執行相同查詢,得到了事務b更新後的結果,事務a兩次相同的查詢,卻得到了不同的結果,這個叫做不可重複讀。是...