第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

SQL Server 2005中的原子UPSERT

SQL Server 2005中的原子UPSERT

12345678_0001 2019-11-29 10:27:09
在SQL Server 2005中執(zhí)行原子“ UPSERT”(存在時(shí)為UPDATE,否則為INSERT)的正確模式是什么?我在SO上看到了很多代碼(例如,請(qǐng)參閱檢查是否存在一行,否則請(qǐng)插入),其代碼分為以下兩部分:UPDATE ...FROM ...WHERE <condition>-- race condition risk hereIF @@ROWCOUNT = 0  INSERT ...要么IF (SELECT COUNT(*) FROM ... WHERE <condition>) = 0  -- race condition risk here  INSERT ...ELSE  UPDATE ...其中<condition>是自然鍵的評(píng)估。上述方法似乎都不能很好地處理并發(fā)。如果我不能讓兩行具有相同的自然鍵,則上述所有情況似乎都有在競(jìng)爭(zhēng)條件場(chǎng)景中插入具有相同自然鍵的行的風(fēng)險(xiǎn)。我一直在使用以下方法,但是我很驚訝沒有在人們的回應(yīng)中看到它,因此我很奇怪它出了什么問題:INSERT INTO <table>SELECT <natural keys>, <other stuff...>FROM <table>WHERE NOT EXISTS   -- race condition risk here?   ( SELECT 1 FROM <table> WHERE <natural keys> )UPDATE ...WHERE <natural keys>請(qǐng)注意,此處提到的競(jìng)爭(zhēng)條件與先前代碼中的競(jìng)爭(zhēng)條件不同。在早期的代碼中,問題在于幻像讀?。ㄐ性谄渌麜?huì)話之間插入到UPDATE / IF之間或SELECT / INSERT之間)。在上面的代碼中,競(jìng)爭(zhēng)條件與DELETE有關(guān)。在(WHERE NOT EXISTS)執(zhí)行之后但在INSERT執(zhí)行之前,是否可以將另一個(gè)行刪除匹配的行?目前尚不清楚WHERE NOT EXISTS在何處與UPDATE一起鎖定任何內(nèi)容。這是原子的嗎?我在SQL Server文檔中找不到該文檔的記錄位置。編輯: 我意識(shí)到這可以使用事務(wù)來完成,但是我想我需要將事務(wù)級(jí)別設(shè)置為SERIALIZABLE以避免幻像讀取問題?對(duì)于這樣一個(gè)普遍的問題,這肯定是大材小用嗎?
查看完整描述

3 回答

?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

在測(cè)試行是否存在時(shí)傳遞updlock,rowlock,holdlock提示。Holdlock確保所有插件都已序列化;行鎖允許并發(fā)更新現(xiàn)有行。


如果您的PK是bigint,則更新可能仍會(huì)阻止,因?yàn)閮?nèi)部哈希會(huì)退化為64位值。


begin tran -- default read committed isolation level is fine


if not exists (select * from <table> with (updlock, rowlock, holdlock) where <PK = ...>

    -- insert

else

    -- update


commit


查看完整回答
反對(duì) 回復(fù) 2019-11-29
?
智慧大石

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊

編輯:Remus是正確的,條件插入w / where子句不能保證相關(guān)子查詢和表插入之間的狀態(tài)一致。


正確的表提示可能會(huì)強(qiáng)制保持一致狀態(tài)。INSERT <table> WITH (TABLOCKX, HOLDLOCK)似乎有效,但是我不知道這是否是有條件插入的最佳鎖定級(jí)別。


在像Remus所述的瑣碎測(cè)試中,TABLOCKX, HOLDLOCK顯示的插入量是沒有表提示的插入量的5倍,并且沒有PK錯(cuò)誤或過程。


原始答案,不正確:


這是原子的嗎?


是的,條件插入w / where子句是原子的,您的INSERT ... WHERE NOT EXISTS() ... UPDATE表單是執(zhí)行UPSERT的正確方法。


我將IF @@ROWCOUNT = 0在INSERT和UPDATE之間添加:


INSERT INTO <table>

SELECT <natural keys>, <other stuff...>

WHERE NOT EXISTS

   -- no race condition here

   ( SELECT 1 FROM <table> WHERE <natural keys> )


IF @@ROWCOUNT = 0 BEGIN

  UPDATE ...

  WHERE <natural keys>

END

單個(gè)語(yǔ)句始終在事務(wù)中執(zhí)行,無論是它們自己(自動(dòng)提交和隱式),還是與其他語(yǔ)句(顯式)一起執(zhí)行。


查看完整回答
反對(duì) 回復(fù) 2019-11-29
  • 3 回答
  • 0 關(guān)注
  • 625 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)