多人同时操作sql表时,需要加什么类型的锁?

我写了一个客户端程序,存在多人同时操作同一个sql表的情况。
表中有两个字段,ID、BillNo,ID为主键。
这两个字段的值都是由客户端程序生成后,再插入到sql表中的。
生成过程是这样的:

客户端程序首先获取sql表的最大ID,加1后,作为ID的值;
然后BillNo = RBB + 最大ID;
最后,将ID、BillNo插入到sql表中。

但是,假如同一时刻,多个客户端同时操作,则获取到的最大ID可能会相同,这样在插入数据时会出现“不能插入重复键”的情况,因为主键重复了。

我想请教一下,类似这样的情况,在获取最大ID时需要给查询加上什么类型的锁?谢谢。

阅读 3.3k
2 个回答

建议使用 Redis 的 String 中的 incr 或 Hash 中的 HINCRBY 来做辅助,而不是取 max 。

这个逻辑是有问题的,加什么锁都没用,因为你取id和插入数据并不是一个整体(或者说是一个事务)。全局唯一id生成,现在有不少解决方案,楼上说的用redis是一种,或者你mysql单独用一种表记录id,每次取都增加。twitter有一个开源库snowflake专门做这个的,思想就是根据时间+主机编号+序号生成全局唯一的id。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进