关于数据库高并发插入的版本号问题

查看 497|回复 49
avadakur
OP
  
@yjhatfdu2 请问开事务有什么作用吗?多个事务之间,该覆盖还不是一样会覆盖吗?
avadakur
OP
  
@shinelamla 在高并发插入的时候怎么处理比较好呢
yjhatfdu2   
@shinelamla 在高并发下两条 insert 语句同时获得了上一个最新的版本号,这样会导致版本号丢失一次自增
vikaptain   
@shinelamla 这个是个典型的不可重复读问题,在 RR 的隔离等级下,这种情况不被允许,一般来说,后一个提交的事务会失败,以避免数据不一致
sunjiayao   
我怎么感觉像是个 XY 问题。要不你说说需求,看你这个数据库设计有点别扭
yjhatfdu2   
userid business_type total_version 设置唯一索引 用 insert on update
securityCoding   
如果是 pg 的话,可以考虑用 advisory_lock,读之前针对 user_id 的值加锁,更新完解锁,这样不会对表或者行加高级的锁,避免影响其他业务,也可以避免引入 redis 带来的通讯开销,应该是性能非常高的方案了
yjhatfdu2   
加分布式锁最安全
shinelamla   
@shinelamla 你这样的问题也是高并发下,失败概率会很高
justfindu   
@avadakur 其实有办法处理的,你这种场景。
1. 考虑你的版本号就不要使用需要自己处理自增的形式,换成毫秒甚至纳秒时间戳,请求必然有个先来后到的
2. 考虑使用事务进行两次插入,先插入一次获取自增 id ,再结合自增 id 更新版本号
3. 最简单,就还是前面几楼提到的:用一个自增操作不就完事了?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部