在資料庫系統處理併發讀寫的情況下,不可避免的要引入事務的概念,相應的,事務之間的隔離級別也就決定了事務所表現出來的效果。
一 讀未提交
最低級別的隔離,如果存在兩個事務a,b,a可以讀取到b事務尚未提交的資料,這種隔離級別導致的最大問題就是髒讀,典型場景例如轉賬,a轉給b 100,a的事務還沒有提交成功的時候,b就已經能查詢到賬戶的增加100,如果此時a的事務處理失敗,而b之前的讀取可能已經將這100消費出去。
二 讀已提交:(不可重複讀)
只能讀取其他事務已經提交過的內容,避免了上述髒讀的問題,只有在a的事物提交已經完成後,b才能讀取到賬戶增加100的操作,如果中途回滾,b完全不受影響。在這種隔離級別下,帶來的乙個問題就是不可重複讀,例如,b事務中有兩次讀取相同資料,a事務發生在這兩次讀取之間,若a事務成功執行,則b事務中兩次讀取資料是不一致的,不可重複讀的意思就是在乙個事務中重複讀取可能得到不一樣的結果,這個問題對於一般使用者來說沒什麼問題,只需要重新重新整理就可以了,但是對於某些資料備份的場景,有可能讀取到部分事務發生前和發生後的混合資料。
三 快照隔離:(可重複讀)
這種隔離級別通過使用 mvcc 多版本併發控制來解決不可重複讀的問題 做到本事務內重複讀結果是一致的也就是可重複讀,通過在事務處理時給資料新增遞增的事務編號,控制低版本的事務不會讀取到高版本事務的內容,這樣在同乙個事務中解決上述不可重複讀的問題,在資料庫同步事務中保證所有資料都是處於固定版本而不是關聯的資料不在同一事務版本中。
即使我們已經這麼做了,我們還是不能保證事務是完全安全的,比如「幻讀」這個場景,例如當前有兩個醫生值班,醫院系統要求最少有乙個醫生值班,這時兩名醫生都要離崗,發起離崗請求:先統計當前在崗人數,大於1時進行離崗操作,這種場景下,在各自的事務中,都查詢到在崗人數是2,此時都進行離崗,這就違反了系統要求。
四 序列:(最高端別隔離)
在上述描述中,似乎只***各個事物是序列執行的,才能滿足要求
可以通過select for update,通過資料庫的行級排他鎖來控制,保證發生在某行資料上的操作是序列執行的。
或者cas(compare and sweap)來控制寫入。
spring事務的isolation(隔離級別)
spring框架的 事務有4種隔離級別 隔離級別 名稱含義 髒讀不可重複讀 幻讀讀未提交 isolation read uncommitted t1讀取t2未提交的東西vv v讀已提交 isolation read committed mysql預設,事務提交後可讀xv v可重複讀 isolatio...
mysql事務 事務隔離isolation
總結事務是要保證一組資料庫操作,要麼全部執行成功,要麼都不執行。mysql支援多引擎,但是並不是所有引擎都支援事務,mysql中只有使用了innodb資料庫引擎才支援事務。事務的特性 acid atomicity原子性,consistency一致性,isolation隔離性,durability永續...
事務隔離級別isolation設定
乙個事務讀取到另乙個事務中未提交的資料,另乙個事務中資料可能進行了改變,此時a事務讀取的資料可能和資料庫中資料時不一致的,此時認為資料是髒資料,讀取髒資料的過程就叫做髒讀。1.主要針對的是某行資料 2.主要針對的操作是修改操作 3.兩次讀取在同乙個事務內 當事務a第一次讀取事務後,事務b對事務a讀取...