电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SQLSERVER 語句交錯引發的死鎖問題案例詳解

瀏覽:98日期:2023-03-06 14:25:44
目錄
  • 一:背景
    • 1. 講故事
  • 二:死鎖簡析
    • 1. 一個測試案例
    • 2. 尋找死鎖源頭
    • 3. 尋找解決方案
  • 三:總結

    一:背景

    1. 講故事

    相信大家在使用 SQLSERVER 的過程中經常會遇到 阻塞死鎖,尤其是 死鎖,比如下面的輸出:

    (1 row affected) Msg 1205, Level 13, State 51, Line 5 Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

    要解決死鎖問題,個人感覺需要非常熟知各種隔離級別,尤其是 可提交讀 模式下的 CURD 加解鎖過程,這一篇我們就來好好聊一聊。

    二:死鎖簡析

    1. 一個測試案例

    開啟兩個會話 6566 ,分別使用如下查詢。

    -- 會話 65 --BEGIN TRANUPDATE dbo.Employees SET Title="Dr." WHERE EmployeeID=1;WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Orders WHERE OrderID=10258ROLLBACK-- 會話 66 --BEGIN TRANUPDATE  dbo.Orders SET  ShipAddress="上海" WHERE OrderID=10258WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Employees WHERE EmployeeID=1;ROLLBACK

    兩個會話非常簡單,交錯的對 EmployeesOrders 進行 SELECT 和 UPDATE 操作,稍等幾秒后就會出現死鎖。

    2. 尋找死鎖源頭

    當我們的應用程序拿到了這樣的輸出其實作用是不大的,要想溯源最好就是通過不斷的對 SQLSERVER 進行監視來捕獲死鎖時的上下文信息,手段也有很多:

    • SQL Server Profile
    • DBCC TRACEON(1222)
    • DMV VIEW

    這里我們就用第一種方式,一定要勾選 TextData 項,因為這里面會有死鎖上下文信息的xml表示,截圖如下:

    將 profile 開啟后,重新執行剛才的兩個查詢,一旦出現死鎖,profile 就會成功捕獲,然后 copy 出 TextData 項,截圖如下:

    <deadlock-list> <deadlock victim="process2d69c9748c8">  <process-list>   <process id="process2d69c9748c8" taskpriority="0" logused="324" waitresource="KEY: 7:72057594043170816 (8194443284a0)" waittime="1304" ownerId="70740" transactionname="user_transaction" lasttranstarted="2023-02-19T22:11:26.413" XDES="0x2d6a0200428" lockMode="S" schedulerid="5" kpid="13816" status="suspended" spid="66" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2023-02-19T22:11:26.413" lastbatchcompleted="2023-02-19T22:11:26.410" lastattention="1900-01-01T00:00:00.410" clientapp="Microsoft SQL Server Management Studio - Query" hostname="DESKTOP-STS8TPB" hostpid="1696" loginname="DESKTOP-STS8TPB\Administrator" isolationlevel="read committed (2)" xactid="70740" currentdb="7" currentdbname="Northwind" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">    <executionStack>     <frame procname="adhoc" line="5" stmtstart="24" stmtend="128" sqlhandle="0x020000007383d935b349bc173c0f104de14945e9a526322b0000000000000000000000000000000000000000">unknown     </frame>     <frame procname="adhoc" line="5" stmtstart="204" stmtend="294" sqlhandle="0x020000002c3b203105961d63d10b17e54ed6ac081105f9450000000000000000000000000000000000000000">unknown     </frame>    </executionStack>    <inputbuf>BEGIN TRANUPDATE  dbo.Orders SET  ShipAddress=&apos;上海&apos; WHERE OrderID=10258WAITFOR DELAY &apos;00:00:10&apos;SELECT * FROM dbo.Employees WHERE EmployeeID=1;ROLLBACK    </inputbuf>   </process>   <process id="process2d6ae694ca8" taskpriority="0" logused="368" waitresource="KEY: 7:72057594044088320 (59ce0997f9b8)" waittime="3468" ownerId="70716" transactionname="user_transaction" lasttranstarted="2023-02-19T22:11:24.247" XDES="0x2d6a7284428" lockMode="S" schedulerid="9" kpid="7124" status="suspended" spid="65" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2023-02-19T22:11:24.247" lastbatchcompleted="2023-02-19T22:11:24.247" lastattention="1900-01-01T00:00:00.247" clientapp="Microsoft SQL Server Management Studio - Query" hostname="DESKTOP-STS8TPB" hostpid="1696" loginname="DESKTOP-STS8TPB\Administrator" isolationlevel="read committed (2)" xactid="70716" currentdb="7" currentdbname="Northwind" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">    <executionStack>     <frame procname="adhoc" line="5" stmtstart="26" stmtend="118" sqlhandle="0x02000000dd7720067e0519b8a368501716c04b4b50cfe6be0000000000000000000000000000000000000000">unknown     </frame>     <frame procname="adhoc" line="5" stmtstart="196" stmtend="282" sqlhandle="0x0200000093f01512208755a056f5f28930fbd3dedf58a2850000000000000000000000000000000000000000">unknown     </frame>    </executionStack>    <inputbuf>BEGIN TRANUPDATE dbo.Employees SET Title=&apos;Dr.&apos; WHERE EmployeeID=1;WAITFOR DELAY &apos;00:00:10&apos;SELECT * FROM dbo.Orders WHERE OrderID=10258ROLLBACK    </inputbuf>   </process>  </process-list>  <resource-list>   <keylock hobtid="72057594043170816" dbid="7" objectname="Northwind.dbo.Employees" indexname="PK_Employees" id="lock2d69ccbbb80" mode="X" associatedObjectId="72057594043170816">    <owner-list>     <owner id="process2d6ae694ca8" mode="X"/>    </owner-list>    <waiter-list>     <waiter id="process2d69c9748c8" mode="S" requestType="wait"/>    </waiter-list>   </keylock>   <keylock hobtid="72057594044088320" dbid="7" objectname="Northwind.dbo.Orders" indexname="PK_Orders" id="lock2d69ccbbf80" mode="X" associatedObjectId="72057594044088320">    <owner-list>     <owner id="process2d69c9748c8" mode="X"/>    </owner-list>    <waiter-list>     <waiter id="process2d6ae694ca8" mode="S" requestType="wait"/>    </waiter-list>   </keylock>  </resource-list> </deadlock></deadlock-list>

    雖然上面有圖形化表示,但在生產環境下參考價值并不多,因為這張圖蘊含的信息比較少,熟讀和整理 xml 的內容就非常必要了,截圖如下:

    仔細觀察上面的這張圖可以清晰的看到,spid=66 持有了 Orders.PK_Orders 索引上哈希碼為 59ce0997f9b8 鍵值的 X 鎖,之后需要再次獲取 Employees.PK_Employees 索引上哈希碼為 8194443284a0 鍵值上的 S 鎖,很不巧的是,此時的 Employees.PK_Employees 索引上哈希碼為 8194443284a0 的鍵值已經被 spid=65 的會話附加了 X 鎖,這是一種典型的相互等待造成的死鎖。

    同時也可以觀察到,我們的語句是一個 adhoc 即時查詢,其外層也沒有 存儲過程 之類的包圍語句。

    3. 尋找解決方案

    知道了是什么語句和什么語句之間的沖突之后,后面的問題就比較簡單了,常見措施如下:

    使用 nolock 臟讀

    由于沖突中涉及到了 S 鎖,其實絕大多數系統對臟讀不是特別敏感,所以使用 nolock 無鎖提示是一個好辦法。

    BEGIN TRANUPDATE  dbo.Orders SET  ShipAddress="上海" WHERE OrderID=10258WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Employees WITH(NOLOCK) WHERE EmployeeID=1;ROLLBACKBEGIN TRANUPDATE dbo.Employees SET Title="Dr." WHERE EmployeeID=1;WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Orders WITH(NOLOCK) WHERE OrderID=10258ROLLBACK

    使用 MVCC 多版本控制

    現代化的關系型數據庫都支持 快照讀 來解決 并發讀寫 的沖突,同時又能保證不臟讀,簡而言之就是在事務修改時將修改前的數據存到 tempdb 中來形成字段的版本化。

    首先需要從 數據庫 級別開啟它。

    ALTER DATABASE Northwind SET ALLOW_SNAPSHOT_ISOLATION ON  

    然后在各自事務中顯式使用 SNAPSHOT 隔離級別查詢,參考sql如下:

    -- 會話 65 --SET TRAN ISOLATION LEVEL SNAPSHOTBEGIN TRANUPDATE dbo.Employees SET Title="Dr." WHERE EmployeeID=1;WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Orders WHERE OrderID=10258ROLLBACK-- 會話 66 --SET TRAN ISOLATION LEVEL SNAPSHOTBEGIN TRANUPDATE  dbo.Orders SET  ShipAddress="上海" WHERE OrderID=10258WAITFOR DELAY "00:00:10"SELECT * FROM dbo.Employees  WHERE EmployeeID=1;ROLLBACK

    三:總結

    在真實的死鎖案例集錦中,相對來說 語句順序交錯 引發的死鎖會相對多一些,其次就是 書簽查找,這個放到后面的文章中來聊,面對 語句順序交錯 的場景盡量的收集整理死鎖的 xml數據,或許有很多意想不到的發現。

    到此這篇關于SQLSERVER 語句交錯引發的死鎖研究的文章就介紹到這了,更多相關sqlserver語句交錯引發的死鎖內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: MsSQL
    主站蜘蛛池模板: 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | AR开发公司_AR增强现实_AR工业_AR巡检|上海集英科技 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦| 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 搪玻璃冷凝器_厂家-越宏化工设备 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 据信,上课带着跳 D 体验-别样的课堂刺激感受引发网友热议 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 路面机械厂家 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 步进驱动器「一体化」步进电机品牌厂家-一体式步进驱动 | R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 首页 - 张店继勇软件开发工作室| 广州各区危化证办理_危险化学品经营许可证代办 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 |