read uncommitted :讀未提交 ——— 引起問題 ———> 隱患:髒讀性能
read committed :讀已提交 ——— 引起問題 ———> 解決髒讀隱患 隱患:不可重複讀spa
repeatable read :可重複讀 ——— 引起問題 ———> 解決髒讀、不可重複讀,隱患:幻讀事務
serializable :可串行化 ——— 引起問題 ———> 解決以上全部隱患 隱患:影響性能,效率過低it
髒讀:A事務讀取可B事務還沒有提交的數據,若是B事務在A事務讀取了還沒有提交的數據後再次改了數據後提交 就會形成A事務的數據所有錯誤io
不可重複讀:A事務對某一數據進行讀取後,進行其餘的操做 ,此時B事務對該數據進行了修改並提交 ,A事務想校驗該數據的真實性,再次讀取該數據形成先後兩次讀取數據的內容的不一樣 (側重點在於內容的不一致)table
幻讀/虛讀: A事務對某一數據進行讀取後,進行其餘的操做 ,此時B事務對該數據進行了增/刪 並提交 ,A事務想校驗該數據的真實性,再次讀取該數據形成先後兩次讀取數據的數量的不一樣 (側重點在於數量的不一致)class
A,B事務同時對一組數據進行操做, A事務操做完以後數據提交, B事務操做後不管是提交仍是回滾 都會使A事務提交的數據無效,形成更新丟失隱患效率
解決方案:date
樂觀鎖:(歷來不以爲會發生更新丟失隱患) 要求在表中額外添加一個字段(假設 versionv int )默認爲0,當A事務對其數據進行修改後,要對其+1操做,第二個事務想執行修改的時候,先查 version是否爲先前查到的值,若是不是從新查詢得到數據再修改提交select
悲觀鎖:(認爲更新丟失確定會發生,採用霸王手段隔絕) 在查詢時 手動添加 排它鎖 select * from xxx for update 能夠理解爲兩我的想喝水,只有一個杯子,先拿到杯子的先喝,喝完纔會把杯子使用權交出來,後面其餘事物想操做這個表,所有處於等待狀態