SqlServer 高併發的情況下,如何利用鎖保證數據的穩定性

来源:https://www.cnblogs.com/wskxy/archive/2023/03/17/17224558.html
-Advertisement-
Play Games

sql的鎖機制,是時刻貫徹在每一次的sql事務中的,為了理解更透徹,介紹鎖之前,我們得先瞭解,鎖是為了乾什麼!! 1、資料庫異常情況 1.1 先來聊聊數據可能發生個異常狀況 1)臟讀:讀未提交,顧名思義,讀到了不該讀的東西,如: 事務B讀到了事務A回滾的數據,就是臟讀 2)不可重覆讀:讀已提交,同個 ...


 

  sql的鎖機制,是時刻貫徹在每一次的sql事務中的,為了理解更透徹,介紹鎖之前,我們得先瞭解,鎖是為了乾什麼!!

 

1、資料庫異常情況  

  1.1 先來聊聊數據可能發生個異常狀況

    1)臟讀:讀未提交,顧名思義,讀到了不該讀的東西,如:

    

    事務B讀到了事務A回滾的數據,就是臟讀  

    2)不可重覆讀:讀已提,同個事務內,多次讀取同個數據,卻返回不同結果,偏向數據更新

    

    事務B發生了不可重覆讀

    3) 幻讀:同個事務內,因其他事務插入或刪除數據,導致讀取到不同的數據量(本質和不可重覆讀相似)

    

     事務B發生了幻讀

  1.2 資料庫用什麼機制來處理這些異常情況的發生,四種隔離級別

    1)讀未提交(Read Uncommitted):發生臟讀,基本沒有資料庫使用這個級別了

    2)讀已提交(Read Committed):大多數資料庫系統的預設隔離級別,解決了臟讀問題

    3)可重覆讀(Repeatable Read):同一事務的多個實例在併發讀取數據時,會看到同樣的數據,解決了不可重覆讀問題

    4)可串列化(Serializable):這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共用鎖。但可能導致大量的超時現象和鎖競爭

    總結:四種級別越往後越影響性能,但數據越穩定,實現機制就是"鎖";

    

2、都有什麼鎖

  2.1鎖的種類:

    1)共用鎖:其他事務可select,無法被update、delete、insert

    2)排他鎖:其他事務不可任何操作

  2.2粒度提示:

    1)rowlock:行鎖,指定到行,select * from dual where id=1會預設行鎖

    2)paglock:頁鎖,select * from dual會預設頁鎖,select的時候先鎖定第一頁,讀取後釋放,再鎖定第二頁,直到讀完

    3)tablock:表鎖,語句結束解鎖

    4)tabockx:表鎖,排他鎖。

    5)nolock:取消預設鎖,涉及大量刪除數據的時候可能會堵塞進程,如果需要select,可以加上nolock來過濾掉需要刪除的數據

    6)holdlock:保持共用鎖,資料庫會根據sql操作加預設鎖

    7)serializable:同holdlock

    8)readcommited:遵循讀已提交隔離級別

    9)updlock:更新鎖,排他鎖

3、舉例子

  3.1 模擬場景,多個客戶在搶一個優惠券

    客戶:kxy

begin tran
    declare @_owner varchar(100);
    set @_owner = (select owner from Coupons with(updlock) where id=2);
    if(@_owner is null or @_owner='')
        begin
            update Coupons  set owner='kxy' where id=2
            waitfor delay '00:00:10'
            print '恭喜您,搶到了!!'
        end;
    else
        print '該券已經被搶了!!'
commit tran

    客戶:keys

begin tran
    declare @_owner varchar(100);
    set @_owner = (select owner from Coupons with(updlock) where id=2);
    if(@_owner is null or @_owner='')
        begin
            update Coupons  set owner='keys' where id=2
            waitfor delay '00:00:10'
            print '恭喜您,搶到了!!'
        end;
    else
        print '該券已經被搶了!!'
commit tran

    用代碼進行搶券,同個時間先後執行kxy和keys搶券

    結果:

      kxy

      

      keys

      

 

 

    持續更新,感謝關註!!!

 


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

-Advertisement-
Play Games
更多相關文章
  • 對於有輕微強迫症的技術人員來說,桌面有個IE圖標且刪不掉是非常不能忍受的,造成這種情況有可能是新裝的操作系統自帶,也有可能是裝了某個軟體(比如SQLyog)後…… 現將刪除IE圖標的方法整理如下: 1.打開運行對話框,兩種方式,點擊開始→運行;Win+R;輸入“gpedit.msc”,打開本地安全策 ...
  • 設置靜態網路 1、設置靜態網路,一是用來不讓地址飄忽不定,二來是為了訪問外網。 命令如下: [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 修改內容: TYPE="Ethernet" BOOTPROTO="stat ...
  • web平臺搭建-LAMP(CentOS-7) 一.準備工作 環境要求: 操作系統:CentOS7.X 64位 關閉SELinux和firewalld防火牆 源碼包:https://pan.baidu.com/s/1P2fq706H8sPeHG6-nfHUSw 提取碼:9ruw 1.安裝編譯工具gcc ...
  • 創建軟鏈接 ln -s [源文件或目錄] [目標文件或目錄] 例如: 當前路徑創建test 引向/var/www/test 文件夾 ln –s /var/www/test test創建/var/test 引向/var/www/test 文件夾 ln –s /var/www/test /var/tes ...
  • 一、什麼是信號? 信號就像是一個突然的電話鈴聲,它會打斷正在進行的程式並引起其註意。 在Linux系統中,信號是一種軟體中斷,它通常是非同步發生的,可以用來通知進程某個事件已經發生。。每個信號都有一個唯一的編號,編號從1開始。進程可以通過註冊信號處理函數來處理信號。 二、信號的分類 Linux系統中的 ...
  • 使用舊電腦玩Linux今天給大家講講使用舊電腦玩Linux,大家應該都知道舊電腦的硬體一般比較落後,特別是一些非常老的電腦,目前還在使用的是機械硬碟,如是要跑windows可想而知,但是Linux系統對硬體性能的要求可比windows低的多了,雖然不像windows那樣有華麗的界面,但Linux是開 ...
  • CentOS 7系統 1. 防火牆操作命令 (1)查看防火牆狀態 systemctl status firewalld (2)重啟防火牆 firewall-cmd --reload (3)關閉防火牆 systemctl stop firewalld (4)啟動防火牆 systemctl start ...
  • iptables是一個Linux內核中的包過濾工具,可以用來過濾、轉發、修改、控制網路流量等。如果想要將主機的所有流量轉發至其他機器,可以使用iptables進行配置。 以下是具體步驟: 1. 首先需要在其他機器上開啟轉發功能,可以使用以下命令開啟: echo 1 > /proc/sys/net/i ...
一周排行
    -Advertisement-
    Play Games
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 呆了2個大屏行業的公司,對大屏幕有一些瞭解,所以整理下所瞭解的觸摸屏相關概念。方便自己以及進入這個行業的小伙伴們,能有個系統、快速的認知。 觸摸屏詳細的知識點,網上其實都有。整理資料過程中,我也瞭解了更多的觸摸屏知識,像聲波屏、光學屏之類的之前就沒接觸。下麵分不同的模塊,給大家介紹 交互觸摸屏類型 ...
  • 近段時間忙於各種項目和對【易排平臺】的優化,沒顧得上分享APS相關的小技巧,回頭看看小公眾號的關註人數早已達1500+,在此爭取時間寫一下這段時間在項目上及平臺優化過程中遇到的一些小技巧,以感謝諸位的關註。過去數月的解決的問題中,涉及最多的是規劃模型中,實現各種時間維度的功能,目前在平臺上也稍有成果 ...
  • 針對大量log日誌快速定位錯誤地方 動態查看日誌 tail -f catalina.ou 從頭打開日誌文件 cat catalina.ou 可以使用 >nanjiangtest.txt 輸出某個新日誌去查看 [[email protected] logs]# cat -n catalina.out |grep 7 ...
  • 前言 RocketMQ是阿裡巴巴旗下一款開源的MQ框架,經歷過雙十一考驗、Java編程語言實現,有非常好完整生態系統。RocketMQ作為一款純java、分散式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等 本篇文章第一部分屬於一些核心概念和工作流程的講解;第二部 ...
  • 在java,c#類的成員修飾符包括,公有、私有、程式集可用的、受保護的。 對於python來說,只有兩個成員修飾符:公有成員,私有成員 成員修飾符是來修飾誰呢?當然是修飾成員了。那麼python類的成員包括什麼呢? python成員: 欄位,方法,屬性 每個類成員的修飾符有兩種: 公有成員:內部外部 ...