請(qǐng)不要編寫(xiě)“如果存在則更新否則執(zhí)行插入”的SQL代碼
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
以前在工作中遇到了學(xué)要編寫(xiě)數(shù)據(jù)同步的SQL語(yǔ)句,需求很簡(jiǎn)單就是同步兩個(gè)表的數(shù)據(jù),例如:某條記錄存在則更新(UPDATE),否則插入(INSERT)。下面的SQL代碼似乎看上去非常合理。(我曾經(jīng)也是這么做的)
這段代碼單獨(dú)運(yùn)行不會(huì)有任何問(wèn)題,但在高并發(fā)下會(huì)出現(xiàn)主鍵沖突,甚至?xí)霈F(xiàn)死鎖。(因?yàn)檫@段代碼是典型的條件爭(zhēng)用,在兩個(gè)事務(wù)同時(shí)運(yùn)行時(shí)候,可能都會(huì)互相等待你要更新的那一行導(dǎo)致死鎖) 如何解決問(wèn)題呢?看下面的代碼,直接編寫(xiě)UPDATE語(yǔ)句如果 Key存在則直接更新,如果@@ROWCOUNT影響的行數(shù)為0則代表記錄不存在,那么執(zhí)行INSERT操作。
這段代碼在并發(fā)下不會(huì)出現(xiàn)問(wèn)題,但是因?yàn)樯厦鎯蓚€(gè)的關(guān)鍵字使用,會(huì)降低并發(fā)性能。 上述解決方案顯然是針對(duì)更新的情況很多的時(shí)候比較有效,但是如果大量數(shù)據(jù)都不存在,那么先執(zhí)行這個(gè)UPDATE語(yǔ)句就浪費(fèi)了很多必要的檢查。針對(duì)此情形下面是解決方案,先進(jìn)行INSERT的條件檢查,如果Key不存在則執(zhí)行INSERT操作,否則執(zhí)行UPDATE。
結(jié)論 盡量使用文中的改進(jìn)方法,如果更新頻繁的則先進(jìn)行UPDATE判斷,否則執(zhí)行INSERT判斷。這些代碼雖然會(huì)限制并發(fā)程度,但100%不會(huì)產(chǎn)生死鎖。 ? 閱讀原文:原文鏈接 該文章在 2025/3/24 17:04:33 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |