数据库高并发插入数据导致的主键冲突问题解决

现代系统都是数据驱动的业务系统,所有的系统都离不开数据,我们现在存储的大部分还是通过关系型数据库来存储的,因为关系型数据库的锁可以保证数据的一致性,所以我们大部分的数据会持久化到数据库中,但是往往数据计算过程比较复杂,都是经过各个应用计算之后的数据,直接操作还不是很方便,所以我们的数据都是通过应用存储到数据库中的,那么问题来了,假如系统高并发运行,同时又两条数据同时执行insert会出现什么,后执行的那条数据会出现错误,数据已经存在了,还有一个场景,我们有一个数据流,假如有三个节点,现在有一条数据顺序经过3个节点,第一个节点新增数据,后面两个节点更新,现在使用消息队列的方式,每个节点处理完成后将自己要插入或要更新的数据存储到数据库,现在的情况是,因为是异步队列,假如现在使用的是一个队列,那么顺序执行是一点问题也没有的,假如我们现在使用的是分布式消息,比如kafka,我们发送出去后,发送了三次可能进入了三个分区,这三个分区的消费者执行的性能可能也会有差异,就会出现后面的先执行而第一条为执行,假如我们持久层使用的hibernate这样的框架,他提供了saveOrUpdate这种方法就会出现异常,所以为了避免这种异常,我们就需要针对不同的数据库使用不同的解决方案来解决这种 因高并发引起的主键冲突问题。

Oracle和Mysql分别提供了很好使用且很好理解的解决方案来处理这个问题,在Oracle中,Oracle提供了Merge info来实现存在则更新,不存在则插入。

Mysql中提供了Insert语句后面指定ON DUPLICATE KEY UPDATE 跟上要更新的字段,这句话的意思就是说当插入的时候已经有数据了就将数据改为更新。

MsSqlServer没有提供相应的执行语句,但是提供了一个参数配置,这种方式并不好,如果使用MsSqlServer的话一定要从应用的角度来控制数据的并发处理。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值