SQL Server多进程多线程并发情况下如何保证insert到一张表中的某个字段顺序递增

发布于 2021-12-03 02:25:46 字数 988 浏览 873 评论 13

两个进程,每个进程中有一个线程往SQL Server的表A中insert记录,但要求整张表A中的字段a是顺序递增的

也就是1、2、3、4、5、6……

有什么办法能在尽可能少用锁,尽可能不过分影响性能的情况下解决这个需求?

用了identity关键字建表,在单线程的情况下OK,但在并发情况下并不能保证严格顺序递增!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

凌乱心跳 2021-12-03 21:58:38

是唯一的,但是出现了乱序

简单气质女生网名 2021-12-03 21:58:36

简直神奇,从没遇到过你说的id字段还不能保证唯一性的。

狼亦尘 2021-12-03 21:58:35

自己维护自增的ID,这个ID变量是一个原子变量就可以了,++时,线程中得到的ID是唯一的,如果函数不是可重入的,可以把++后的结果赋值给线程特定数据的变量,这样肯定是唯一的

绝影如岚 2021-12-03 21:58:35

你是不是出现了事务回滚,然后自增字段中间跳号了,类似4后面直接到6了的情况?

筱武穆 2021-12-03 21:58:30

没有重复,还是唯一的,只是出现了乱序

虐人心 2021-12-03 21:58:30

如果 设置为主键, 又发生重复, 也就是说 这数据库 不能用, 对吗?

成熟稳重的好男人 2021-12-03 21:58:27

"并发时id字段会不能保证严格顺序递增"

是重复了,还是中间缺少了?

有否设置为 主键?

猫九 2021-12-03 21:58:25

我是在SQL Server Management中创建两个会话,然后同时Insert大量数据到一张表中,最后就是出现了不连续的情况

秋意浓 2021-12-03 21:58:25

可以试下
#iBoxDB#中的
更新自增功能,或者使用
CommitEvent,这两个功能都能保持顺序执行,前者是对一个长整数的递增,后者是随意执行代码。

db.GetConfig().EnsureUpdateIncrementIndex<MemberInc>("MemberInc", "Version");

https://www.oschina.net/news/48144/iboxdb-csharp-java

飘过的浮云 2021-12-03 21:57:32

使用mssql多年,没遇到过 并发时id字段会不能保证严格顺序递增。。。。

是不是驱动的问题?我用的是ado。

长安忆 2021-12-03 21:57:28

AliSQL:电商的秒杀场景,其实就是减库存,对数据库而言,就是对一条记录的更新。 因为事务的特点,单条记录的更新必须串行完成, 但秒杀的特点,就是在某个时刻,大量的并发进行减库存, 这就造成了大量的线程因获取不到锁而处在死锁检测状态, 消耗了大量的CPU资源,最终导致系统无法响应,而引起雪崩效应。

酷到爆炸 2021-12-03 21:53:50

求教

并发会降低tps,那多个并发进程像一个队列写数据,另一端一个进程写到数据库性能又如何?

冷弦 2021-12-03 21:53:10

所有进程的数据先进队列,然后队列一个一个入库。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文