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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013560667/article/details/89239536

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

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

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

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

猜你喜欢

转载自blog.csdn.net/u013560667/article/details/89239536