请不要编写“如果存在则更新否则执行插入”的SQL代码
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
以前在工作中遇到了学要编写数据同步的SQL语句,需求很简单就是同步两个表的数据,例如:某条记录存在则更新(UPDATE),否则插入(INSERT)。下面的SQL代码似乎看上去非常合理。(我曾经也是这么做的)
这段代码单独运行不会有任何问题,但在高并发下会出现主键冲突,甚至会出现死锁。(因为这段代码是典型的条件争用,在两个事务同时运行时候,可能都会互相等待你要更新的那一行导致死锁) 如何解决问题呢?看下面的代码,直接编写UPDATE语句如果 Key存在则直接更新,如果@@ROWCOUNT影响的行数为0则代表记录不存在,那么执行INSERT操作。
这段代码在并发下不会出现问题,但是因为上面两个的关键字使用,会降低并发性能。 上述解决方案显然是针对更新的情况很多的时候比较有效,但是如果大量数据都不存在,那么先执行这个UPDATE语句就浪费了很多必要的检查。针对此情形下面是解决方案,先进行INSERT的条件检查,如果Key不存在则执行INSERT操作,否则执行UPDATE。
结论 尽量使用文中的改进方法,如果更新频繁的则先进行UPDATE判断,否则执行INSERT判断。这些代码虽然会限制并发程度,但100%不会产生死锁。 阅读原文:原文链接 该文章在 2025/3/24 17:04:33 编辑过 |
关键字查询
相关文章
正在查询... |