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、設置靜態網路,一是用來不讓地址飄忽不定,二來是為了訪問外網。 命令如下: [root@localhost ~]# 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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...