日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

請不要編寫“如果存在則更新否則執行插入”的SQL代碼

admin
2025年3月23日 23:21 本文熱度 338

以前在工作中遇到了學要編寫數據同步的SQL語句,需求很簡單就是同步兩個表的數據,例如:某條記錄存在則更新(UPDATE),否則插入(INSERT)。下面的SQL代碼似乎看上去非常合理。(我曾經也是這么做的)

IF EXISTS (SELECT 1 FROM dbo.t WHERE [key] = @key)BEGIN  UPDATE dbo.t SET val = @val WHERE [key] = @key;ENDELSEBEGIN  INSERT dbo.t([key], val) VALUES(@key@val); END

這段代碼單獨運行不會有任何問題,但在高并發下會出現主鍵沖突,甚至會出現死鎖。(因為這段代碼是典型的條件爭用,在兩個事務同時運行時候,可能都會互相等待你要更新的那一行導致死鎖)

如何解決問題呢?看下面的代碼,直接編寫UPDATE語句如果 Key存在則直接更新,如果@@ROWCOUNT影響的行數為0則代表記錄不存在,那么執行INSERT操作。

BEGIN TRANSACTION;
UPDATE dbo.t WITH (UPDLOCK, SERIALIZABLE) SET val = @val WHERE [key] = @key;
IF @@ROWCOUNT = 0BEGIN  INSERT dbo.t([key], val) VALUES(@key@val);END

  • UPDLOCK用于防止語句級別的轉換死鎖(讓另一個會話等待,而不是鼓勵受害者重試)。

  • SERIALIZABLE用于防止整個事務中對基礎數據的更改(確保不存在的行繼續不存在)。

這段代碼在并發下不會出現問題,但是因為上面兩個的關鍵字使用,會降低并發性能。

上述解決方案顯然是針對更新的情況很多的時候比較有效,但是如果大量數據都不存在,那么先執行這個UPDATE語句就浪費了很多必要的檢查。針對此情形下面是解決方案,先進行INSERT的條件檢查,如果Key不存在則執行INSERT操作,否則執行UPDATE。

BEGIN TRANSACTION;
INSERT dbo.t([key], val)   SELECT @key@val  WHERE NOT EXISTS  (    SELECT 1 FROM dbo.t WITH (UPDLOCK, SERIALIZABLE)      WHERE [key] = @key  );
IF @@ROWCOUNT = 0BEGIN  UPDATE dbo.t SET val = @val WHERE [key] = @key;END
COMMIT TRANSACTION;

結論

盡量使用文中的改進方法,如果更新頻繁的則先進行UPDATE判斷,否則執行INSERT判斷。這些代碼雖然會限制并發程度,但100%不會產生死鎖。

?

閱讀原文:原文鏈接


該文章在 2025/3/24 17:04:33 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产电影在线精品亚洲 | 国产一卡二卡三卡四卡在线看 | 亚洲高清一区二区三区不卡 | 521a成v视频网站在线入口 | 亚洲高清一区二区三区不卡 | 亚洲欧美日韩中文另类不卡 | 日本中文字幕一区二区视频 | 国产一区二区在线观看动漫 | 91成人免费观看 | 日本不卡高清在线 | 中文字幕不卡欧美日韩在线 | 国产色综合天天综合网 | 国产十欧美| 日产亚洲一卡2卡3卡4卡网站 | 亚洲不卡一卡2 | a网站在线观看 | 国产精选在线视频 | 亚洲性之站 | 国内最真实的xxxx人伦 | 两性刺激生活片免费 | 中文字字幕乱码无线精品精品 | 91视频精品全国免费观看 | 国产亚洲人成网站观看 | 码二码三码四码 | 欧美精品亚洲精品日韩 | 欧美中文字幕在线视 | 欧美丰满大 | 91美女片黄在线观看 | 亚洲人成色4444在线观看 | 自宅警备员ova动漫 国产第一区 | 国内精品视频在线中文字幕 | 亚洲aⅴ精品国产首次亮相 国产炮机主播在线观看 | 国产福利在线观看片 | 国产精品永久在线 | 国产精品亚洲无线码在线播放 | 一色屋色费精品视频在线看 | 国产成a人亚洲精品无 | 亚洲欧洲日产国码在线 | 国产高清一区二区在线免费观看 | 777国产偷窥盗摄精品原味 | 最新高清电影在线免费观看 |