SQL Server多进程多线程并发情况下如何保证insert到一张表中的某个字段顺序递增
两个进程,每个进程中有一个线程往SQL Server的表A中insert记录,但要求整张表A中的字段a是顺序递增的
也就是1、2、3、4、5、6……
有什么办法能在尽可能少用锁,尽可能不过分影响性能的情况下解决这个需求?
用了identity关键字建表,在单线程的情况下OK,但在并发情况下并不能保证严格顺序递增!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
是唯一的,但是出现了乱序
简直神奇,从没遇到过你说的id字段还不能保证唯一性的。
自己维护自增的ID,这个ID变量是一个原子变量就可以了,++时,线程中得到的ID是唯一的,如果函数不是可重入的,可以把++后的结果赋值给线程特定数据的变量,这样肯定是唯一的
你是不是出现了事务回滚,然后自增字段中间跳号了,类似4后面直接到6了的情况?
没有重复,还是唯一的,只是出现了乱序
如果 设置为主键, 又发生重复, 也就是说 这数据库 不能用, 对吗?
"并发时id字段会不能保证严格顺序递增"
是重复了,还是中间缺少了?
有否设置为 主键?
我是在SQL Server Management中创建两个会话,然后同时Insert大量数据到一张表中,最后就是出现了不连续的情况
可以试下
#iBoxDB#中的
更新自增功能,或者使用
CommitEvent,这两个功能都能保持顺序执行,前者是对一个长整数的递增,后者是随意执行代码。
https://www.oschina.net/news/48144/iboxdb-csharp-java
使用mssql多年,没遇到过 并发时id字段会不能保证严格顺序递增。。。。
是不是驱动的问题?我用的是ado。
AliSQL:电商的秒杀场景,其实就是减库存,对数据库而言,就是对一条记录的更新。 因为事务的特点,单条记录的更新必须串行完成, 但秒杀的特点,就是在某个时刻,大量的并发进行减库存, 这就造成了大量的线程因获取不到锁而处在死锁检测状态, 消耗了大量的CPU资源,最终导致系统无法响应,而引起雪崩效应。
求教
并发会降低tps,那多个并发进程像一个队列写数据,另一端一个进程写到数据库性能又如何?
所有进程的数据先进队列,然后队列一个一个入库。