淺談資料庫的隔離等級

来源:http://www.cnblogs.com/xustwn/archive/2017/07/01/7102612.html
-Advertisement-
Play Games

資料庫事務的隔離等級,英語叫做 Transaction Isolation Level。 最近在給客戶維護項目的時候,對一個表在兩個進程中同時做更新和查詢時碰到了死鎖(DeadLock),數據表裡有幾百萬上千萬條記錄,上面的處理當時是更新幾千條記錄, 查詢整張表。 這是前提,為了搞明白這個死鎖,大概 ...


資料庫事務的隔離等級,英語叫做 Transaction Isolation Level。

最近在給客戶維護項目的時候,對一個表在兩個進程中同時做更新和查詢時碰到了死鎖(DeadLock),數據表裡有幾百萬上千萬條記錄,上面的處理當時是更新幾千條記錄,

查詢整張表。

這是前提,為了搞明白這個死鎖,大概涉及到死鎖,隔離等級,鎖升級以及Trace跟蹤的內容,陸續整理出來,今天說說隔離等級。

 

概要

有下麵3種讀取不具合的現象,首先說說關於RDBMS的ACID特性的I(Isolation-隔離性)

·臟讀

·不可重覆讀

·幻影讀

接著說說事務隔離等級的4個等級。

·Read uncommitted

·Read committed

·Repeatable read

·Serializable

越往下隔離等級越高,越往上隔離等級越低。

對於最高的隔離等級,上邊的3中讀取不具合現象就不會發生了。但是,系統性能就會有很大的損失。

大概可以總結為[想要提升系統性能就要接受一定程度的讀取不具合,如果即使性能低一些也沒有關係那就不會發生讀取上的不具合]

 

讀取不具合

說明一下這3中讀取不具合現象

臟讀

讀取到別的事務還沒有提交的數據的現象:

1.事務A要把記錄a更新到記錄b(還沒提交時)

2.事務B查詢了記錄

3.事務A做了回滾

4.事務B讀到了記錄b

這是把隔離等級設到最低級別了啊,還沒見過這樣的系統。

 

不可重覆讀

讀到了別的事務更新後的數據,導致出現了非連貫性的讀取操作。

1.事務A查詢了記錄,稱之為a

2.事務B把記錄a的內容更新到記錄b,並且提交了。

3.事務A對記錄a再次進行查詢,取得的內容已經變成了記錄b。

幻影讀

看到了其它事務插入的記錄導致出現的非連貫現象。

1.事務A查詢記錄時沒有記錄。

2.事務B插入記錄並提交。

3.事務A再次查詢記錄時取得了事務B插入的記錄。

是不是感覺和不可重覆讀有點像呀,重點在是插入操作還是更新操作。

另外,下麵也是幻影讀

1.事務A統計記錄是X件。

2.事務B插入記錄並提交。

3.事務A再次統計記錄,取得的件數是X+1件。

這就是關於讀取操作的3種不具合現象。

 

事務隔離等級和讀取不具合的關係

  臟讀 不可重覆讀 幻影讀
Read uncommitted 發生   發生 發生
Read committed 不發生 發生 發生
Repeatable read 不發生 不發生 發生
Serializable 不發生 不發生 不發生

 

 

 

 

 

這樣看是不是覺得每次都選擇設置隔離等級為Serializable(可序列化)就一勞永逸了呀,

其實隔離性設置高了也是有問題的啊。這文就不說明瞭,要不又是一大段,有興趣的調查下吧。

 

關於幾個重點

·設置隔離等級也不能說就一定可以保證不會發生對應的某種錯誤。和具體的資料庫實裝RDBMS有很大

關係,例如MySQL的REPEATABLE READ的隔離等級也不會發生幻影讀。

·所謂的【保證不發生】,為了不發生錯誤而採取的處理方法也因資料庫RDBMS而不同。在發生異常時

有些資料庫會報異常,有的會等待事務結束。

·資料庫RDBMS的預設隔離等級各異,對應的隔離級別也不同。

MySQL(InnoDB) REPEATABLE READ    
PostgreSQL READ COMMITTED    
Oracle READ COMMITTED    
SQL Server READ COMMITTED    

 

 

 

 

 

 

就這樣,寫這點也挺花時間,有空再更新關於SQLServer的死鎖,鎖升級和Trace跟蹤。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本人前段時間做一個社區電商應用,發現了一個 天坑 ...................讓我哭會 。 下麵聽聽我的踩坑之路吧 ,電商肯定跟¥打交道了,計算少不了的。由於本人太菜 單純的以為 float double 可以直接參与加減乘除 感覺這種代碼萬無一失沒去想這麼多直接 float*int 。 ...
  • 一,效果圖。 二,工程圖。 三,代碼。 ViewController.h ViewController.m ...
  • 1、向數據表添加註釋及查詢表註釋 2、向表中添加列及添加相應註釋 ...
  • 而這就是我們最初設定的願景。 加速高質量的交付,提升開發者的價值。我們技術團隊所做的每一個步驟、每一個過程都是疊加的、遞增的,日拱一卒,功不唐捐。 ...
  • 絕對值函數ABS() 圓周率PI(),小數預設6位 平方根函數SQRT() 求餘函數MOD(x,y) 向上取整CEIL(x),CEILING(x) 向下取整FLOOR(x) 隨機數RAND(),RAND(x) :產生0~1之間的浮點數,有參數時,相同的參數產生的隨機數相等 四捨五入ROUND(x) ...
  • Memcached是一個自由開源的,高性能,分散式記憶體對象緩存系統。 key-value存儲方式。 Memcached只有String的存儲結構。 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/7102128.html (保留出處並非什麼原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的一些錯誤進行修正或補充,無他) 本文的資料庫版本是MySQL5.7.18,簡單介紹一下MySQL數據文件目 ...
  • ACID:資料庫事務正確執行所必須滿足的四個基本要素的縮寫: 原子性(atomicity,或叫不可分割性),一致性(consistency),隔離性(isolation,又稱獨立性),持久性(durability)。 四大特性 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...