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

查看 498|回复 49
themostlazyman   
一定要加 1 吗, 每个用户增量唯一的话, 是否可以使用 自增的 id 来作为最后的版本 number
themostlazyman   
@themostlazyman 细化下,假设是 mysql 的 innodb 引擎。插入场景:1.userid,business_type 建立联合索引,数据库上锁 userid,business_type 锁范围
avadakur
OP
  
@themostlazyman 2.redis 设置业务键+:userid+:business_type 为键来上锁。先上锁再读版本。
markgor   
@justfindu
@shinelamla
每个用户的不同 business_type 都是重新计算版本号的,不用业务有不同版本号,自增操作要通过触发器来更新,触发器现在公司尽量不能使用
avadakur
OP
  
`
INSERT INTO test_tbl (userid , business_type , config_id , total_version) VALUES (1,1,1,(SELECT maxVersion FROM (select IFNULL(max(total_version),0)+1 as maxVersion from test_tbl where userid =1 and business_type =1) as b))
`
沒試過高並發下效果,可以自己試試
markgor   
@themostlazyman 上锁可以解决所有并发问题,但是现在可能会对性能有影响,我一开始的方案也是上锁
zhengwenk   
另外換一個角度,為什麼不使用纳秒呢?
比如業務場景下,根據數據產生時間生成纳秒級別記錄,此時沒插入,丟入隊列;
然後根據數據庫承受能力調控出列寫入速度;
查詢的場景根據排序自己加上版本號,通過數據產生時的納秒當作排序;
這樣會不會更好解決?
shinelamla   
虚心求教 同一个 userid,business_type 在什么场景下有高并发
markgor   
@markgor 正是我前面说到的第一点,所见略同
edward1987   
@shinelamla 我在用毫秒,就是數據處理不過來,丟隊列裡面,處理完后根據接收時候的毫秒入庫。
業務大概 20QPS 以內,毫秒級別暫時沒出現過重複。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部