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