1. 程式人生 > >資料庫事務隔離級別與併發產生的問題

資料庫事務隔離級別與併發產生的問題

資料庫的可序列化保證了那些可序列性的事務進行極小的併發度。同時SQL標準也規定對於不要求精確結果的長事務可以以不可序列化的方式執行。

資料庫的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒寫、髒讀、不可重複讀、幻讀這幾類問題。

√: 可能出現    ×: 不會出現

髒讀 不可重複讀 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

資料庫以不可序列化的方式執行可能出現的問題有4個,分別為髒寫、髒讀、不可重複寫、幻象讀這4個問題。

髒寫(更新異常):A事務寫了一個數據項且尚未提交,B事務就更改該資料項提交,造成A事務的修改丟失。

對於SQl標準而言,所有的隔離級別都不允許發生髒寫,即:A事務對資料項進行了更新操作,不允許任何事務在A未提交的情況下繼續更新該資料項。即最低的隔離界別Read uncommitted。Read uncommitted要求在事務A未提交的情況下,其他事務(事務B)不可以對A資料項修改過的資料項進行第二次修改,但是可以讀。Read uncommitted可以有效防止髒寫的發生。

考慮如下符合Read uncommitted要求的事務排程:

A事務更新了某資料項,B事務讀取了該資料項,緊接著A再次對資料項進行了更新(或者回滾)此時B事務讀取的資料項就出現了異常,我們稱為髒讀。

為了解決髒讀現象,SQL標準規定了第二個資料庫事務隔離級別:Read committed,即已提交讀。Read committed要求在滿足第一層隔離級別的基礎上,事務B讀取A事務更新的資料項必須在A事務提交之後。Read committed的要求保證了事務B不會出現髒讀現象,因為A事務不能再對該資料項進行更新或回滾。

繼續考慮如下符合Read committed的要求排程:A事務讀取(未作更新)了某資料項,B事務讀取並更新了該資料項,B事務提交,接著A事務再次讀取該資料項。

此時A事務發生了異常,稱之為不可重複讀

為了解決不可重複度現象,SQL標準規定了第三個資料庫事務隔離級別:Repeatable read,即可重複讀。Repeatable read要求在滿足前兩層隔離級別的基礎上,對於A事務已經讀取的資料項,B事務不能做任何修改。Repeatable read的要求保證了事務A不會出現不可重複度現象。因為B不能對A讀取的資料項做任何的修改。

接著考慮如下符合Repeatable read要求的排程:A事務查詢了某表中所有符合條件的資料項,B事務在表中又插入了一條資料項且剛好符合A查詢的條件並提交,接著A事務再次以同樣標準查詢該表,發現多了與上次結果不同,出現了幻象。此時A事務出現異常,稱之為幻象讀

為了解決幻想讀的問題SQL標準提出了第四個資料庫事務隔離級別:Serializable,即可序列化。要求資料庫的排程不許保證可序列化即該排程產生的結果必須和某個序列排程保證一致性的結果。

隔離級別的前兩個要求事務A一旦更新了資料項,事務B就不能對資料項進行更新操作,第一個級別個第二個級別的區別為要不要去事務A的更新操作進行提交。對於第三個級別,要求增加到了一旦事務A讀取了資料項(未修改),事務B就不能更新了。

通常隔離級別越高,越能保證資料的完整性和一致性,但是對併發的效率就越低。一般情況下,採用讀已提交或者可重複讀,它能夠有效避免髒讀和不可重複讀。

學習隨筆,不對之處請指正。

參考:http://blog.csdn.net/fg2006/article/details/6937413

參考:http://blog.csdn.net/u012012621/article/details/50787576

相關推薦

資料庫事務隔離級別併發產生的問題

資料庫的可序列化保證了那些可序列性的事務進行極小的併發度。同時SQL標準也規定對於不要求精確結果的長事務可以以不可序列化的方式執行。 資料庫的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Se

資料庫事務隔離級別鎖機制的實現----不是針對PostgreSQL,而是普遍的原理,來自網際網路,有刪節

文章來自原文連結: 版權歸原作者所有,有刪節,只保留對我理解有幫助的部分。 事務隔離級別通過鎖的實現機制兩個鎖排他鎖: 被加鎖的物件只能被持有鎖的事務讀取和修改,其他事務無法在該物件上加其他鎖,也不能讀取和修改該物件。 共享鎖: 被加鎖的物件可以被持鎖事務讀取

關於資料庫事務隔離級別

 一、什麼是事務事務簡單的來說就是把對資料庫的一系列操作放到一個可控制的過程中,進行可量化的控制,事務有4個必須的屬性原則:1、原子性:必須保證在一個事務中的操作要麼全部執行,要麼全部不執行。 2、一致性:事務操作在完成時必須使資料庫保持一致的狀態,內部資料結構必須是完整的

資料庫隔離級別併發問題

資料庫的隔離級別有四種  分別為:read uncommitted(讀未提交)、read committed(讀已提交)、repeatable read(重複讀)、serializable(序列化)。而多使用者同時訪問資料庫會產生的併發問題有:髒讀、不可重複讀和幻讀。很顯然

mysql事務隔離級別鎖的關系

美團 enc 自己 ren 問題總結 關系 sql 事務 sql事務 其實操作了這麽久mysql一直也沒有把mysql中事務跟鎖的關系弄得特別清楚。然後搜到美團這篇文章,順便結合一下自己遇到的問題總結一下。 首先事務有四種隔離級別: Refere

資料庫隔離級別以及併發問題(附spring+postgresql實際例子及解決方案)

參考資料 postgreSQL預設的隔離級別及修改 資料庫事務的四大特性以及事務的隔離級別 前言 在資料庫併發的事務中,可能產生的問題: 1,髒讀   髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。   當一個事務正在多次修改某個資料,而在這個

一文看懂 MySQL事務隔離級別

資料庫鎖 共享鎖(Shared lock) 例1: ---------------------------------------- T1: select * from table (請想象它需要執行1個小時之久,後面的sql語句請都這麼想象

針對資料庫事務隔離級別的討論期待你的參與

af8k10嗣古陀呢胖鞠《http://baobao.baidu.com/question/5b160dce5375bd9862cb9441667e517e?PL》 cxi1z6匱克壯虐刺籃《http://baobao.baidu.com/question/11766989b

資料庫事務隔離級別-- 髒讀、幻讀、不可重複讀(清晰解釋)

一、資料庫事務隔離級別 資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 √: 可能出

遇到mysql資料庫事務隔離級別相關的小坑

幾乎所有軟體工程師都知道,mysql有4種事務隔離級別,但是實際開發過程中可能有時候忽略這個小細節,有時候可能是本來就沒有考慮過,有時候也可能是其他的原因,比如我這次踩到的小坑。 事情還原: 1、需求一:是新建一個商戶,但是客戶要求在建立商戶的時候要預設給他們開

資料庫事務隔離級別-- 髒讀、幻讀、不可重複讀

一 、資料庫事務隔離級別 從高到低: 序列化    serilizable      消耗資源比較嚴重 重複讀    repeatable read    Oracle 預設的事務隔離級別 讀提交    read committed    Mysql 預設的隔離級別

mysql關於資料庫事務隔離級別測試(包含例項測試語句,及測試結果對比)

1、知識點; 事務的四大特性 ACID ;  原子性(Atomic):事務是一個整體(無論在該事務中操作任何CRUD),要不全部執行,要不全部不執行。(資料庫能夠進行操作的最小的邏輯單元) 一致性(Consistent):組成一個事務的操作是CRUD,要麼全部成功,要

資料庫事務隔離級別,ACID,spring事務傳播性

ACID,是指在資料庫管理系統(DBMS)中事務所具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。 在資料庫系統中,一個事務是指由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額

MySQL資料庫事務隔離級別(Transaction Isolation Level)

今天在學習JDBC的時候看到了關於MySql的事務的隔離級別的問題,感覺內容挺高階的,所以記錄一篇文章,以備後面使用。 資料庫隔離級別有四種,應用《高效能mysql》一書中的說明: 然後說說修改事務隔離級別的方法: 1.全域性修改,修改mysql.in

資料庫事務隔離級別,及髒讀,幻讀,虛讀

轉載:http://blog.csdn.net/u013474436/article/details/53437220 事務的特性: 原子性:指處於同一個事務中的多條語句是不可分割的。一致性:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。比如轉賬,轉賬前兩個

MySQL事務隔離級別

髒讀:資料1;A事務修改2未提交,B事務檢視2,A事務ROLLBACK,B事務看到不正確資料。 不可重複讀:A事務檢視,B事務修改提交,A事務再次檢視,資料不一樣。reaptable red可重讀:A事務檢視,B事務不能提交修改。 幻讀:A事務修改全部行,B事務插入新行,A

資料庫事務隔離級別例項探討

我們知道,資料一般有如下四種隔離級別 0.  read uncommitted (讀未提交)1.  read committed (讀已提交)2.  repeatabale read (可重複讀)3.  serializable read (序列化讀) 下面通過例項介紹這

資料庫事務隔離級別,髒讀、不可重複讀、幻讀

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable  ,後面三個可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 髒讀 不可重複讀 幻讀 Read u

資料庫事務隔離級別測試-postgresql

1. read-committed (default 級別) 客戶端A: epmdb=> start transaction ; START TRANSACTION epmdb=> update t1.dbversion  set  value =1200  w

PG資料庫事務隔離級別

Postgres資料庫事務隔離級別介紹 0. What is Database Transaction? 資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事