事務,就是一組運算元據庫的動作集合。
如果一組
處理步驟
全部發生或者一步也不執行,我們稱該組處理步驟為乙個事務。
當所有的步驟像乙個操作一樣被完整地執行,我們稱該事務被提交。
由於其中的一部分或多步執行失敗,導致沒有步驟被提交,則事務必須回滾到最初的系統狀態。
二、事務的併發問題
1、髒讀:事務
a讀取了事務b更新
、未提交
的資料,然後b回滾操作,那麼
a讀取到的資料是髒資料
(沒有用的資料
)2、不可重複讀:事務
a 多次讀取同一資料,
結果讀取的資料不一致,也就是說不支援重複讀,重複讀會有錯誤。
原因是事務 b 在事務
a多次讀取的過程中,對資料作了更新並提交,導致事務
a多次讀取同一資料不一致。
3、
幻讀:事務a讀取所有工資為
5000
的人數為
10人。此時,事務
b插入一條工資也為
5000
的記錄。這
時,事務a再次讀取工資為
5000
的員工,記錄為
11人。此時產生了幻讀。
需要表鎖才能隔離,所以大都數資料庫都
沒有將幻讀隔離。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於
修改,幻讀側重於
新增或刪除
。解決不可重複讀的問題只需
鎖住滿足條件的行
,解決幻讀需要
鎖表三、mysql事務隔離級別
事務隔離級別
讀取速度
髒讀不可重複讀
幻讀含義
讀未提交(read-uncommitted
)效率高,
但是不用是是
是允許你讀取還未提交的改變了的資料。可能導致髒、幻、不可重複讀
不可重複讀
級別的(read-committed
)orcale
採用的級別否是
是允許在併發事務已經提交後讀取。可防止髒讀,但幻讀和 不可重複讀仍可發生
可重複讀(repeatable-read
)mysql
的級別否否是
對相同欄位的多次讀取是一致的,除非資料被事務本身改變。可防止髒、不可重複讀,但幻讀仍可能發生。
序列化(serializable
)隔離級別最高
安全,效率最低否否
否完全服從acid
的隔離級別,確保不發生髒、幻、不可重複讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的資料表來完成的。
事務的隔離級別 ,是由資料庫提供的 ,並不是所有資料庫都支援四種隔離級別
mysql : read_uncommitted、
read_committed
、repeatable_read
、serializable (預設
repeatable_read
)oracle :
read_uncommitted
、read_committed
、 serializable
(預設
read_committed
)查詢當前級別 mysql>select @@tx_isolation
spring
五種隔離級別
第一種是預設的,isolation_default 使用資料庫預設的事務隔離級別.
另外四個與jdbc的隔離級別相對應;
第二種是isolation_read_uncommited, 會產生髒讀
, 不可重複讀
, 幻讀
第三種是isolation_read_commited, 可以防止髒讀
, 但是會發生不可重複讀和幻讀
第四種是isolation_repeatable_read, 可以防止髒讀和不可重複度
, 但是會產生幻讀
第五種是isolation_serializable,是
spring
事物的最高隔離級別
, 可以防止髒讀
,不可重複讀
, 幻讀的發生
, 但是這種隔離級別極大的犧牲了效能
.其中spring七個事物傳播屬性:
propagation_required -- 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。
propagation_supports -- 支援當前事務,如果當前沒有事務,就以非事務方式執行。
propagation_mandatory -- 支援當前事務,如果當前沒有事務,就丟擲異常。
propagation_requires_new -- 新建事務,如果當前存在事務,把當前事務掛起。
propagation_not_supported -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
propagation_never -- 以非事務方式執行,如果當前存在事務,則丟擲異常。
propagation_nested -- 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,
則進行與propagation_required類似的操作。
補充:
1、
sql規範所規定的標準,不同的資料庫具體的實現可能會有些差異
2、
mysql
中預設事務隔離級別是可重複讀時並不會鎖住讀取到的行
3、事務隔離級別為讀提交時,寫資料只會鎖住相應的行
4、事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表。
5、事務隔離級別為序列化時,讀寫資料都會鎖住整張表
6、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為
read committed
,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
事務隔離級別與髒讀 幻讀 不可重複讀
我們知道,事務的四大特性是a 原子性 c 一致性 i 隔離性 d 永續性 事務隔離級別就是為了滿足隔離性的機制。在併發場景下,如果沒有一定的處理方式,就會出現髒讀 幻讀 不可重複讀三類問題。髒讀 事務a在執行過程中,修改了某資料,事務b讀取了修改後的資料,然後事務a進行了回滾操作,這個時候事務b讀取...
事務隔離級別 髒讀 不可重複讀 幻讀 介紹
事務是現代關係型資料庫的核心之一。在多個事務併發運算元據庫 多執行緒 網路併發等 的時候,如果沒有有效的避免機制,就會出現以下幾種問題 a事務執行過程中,b事務讀取了a事務的修改。但是由於某些原因,a事務可能沒有完成提交,發生rollback了操作,則b事務所讀取的資料就會是不正確的。這個未提交資料...
髒讀 幻讀和不可重複讀 事務隔離級別
1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。e.g.1.mary的原工資為1000,財務人員將mary的工資改為了8000 但未提交事務 2.mary讀取自己的工資 發現自己的工資變為了800...