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

xumenger 发布于 2016/09/14 14:17
阅读 1K+
收藏 0

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

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

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

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

加载中
0
zabcd117
zabcd117
所有进程的数据先进队列,然后队列一个一个入库。
0
IdleMan
IdleMan

求教

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

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

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

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

xumenger
xumenger
我是在SQL Server Management中创建两个会话,然后同时Insert大量数据到一张表中,最后就是出现了不连续的情况
0
iBoxDB
iBoxDB
可以试下#iBoxDB#中的更新自增功能,或者使用CommitEvent,这两个功能都能保持顺序执行,前者是对一个长整数的递增,后者是随意执行代码。
db.GetConfig().EnsureUpdateIncrementIndex<MemberInc>("MemberInc", "Version");

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


0
vga
vga

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

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

有否设置为 主键?

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

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



0
Xiao'J
Xiao'J
自己维护自增的ID,这个ID变量是一个原子变量就可以了,++时,线程中得到的ID是唯一的,如果函数不是可重入的,可以把++后的结果赋值给线程特定数据的变量,这样肯定是唯一的
0
很成立
很成立
你是不是出现了事务回滚,然后自增字段中间跳号了,类似4后面直接到6了的情况?
0
sxgkwei
sxgkwei
简直神奇,从没遇到过你说的id字段还不能保证唯一性的。
haitaosoft
haitaosoft
什么叫乱序? a该8,b该9,变成a是9,b是8了? 2个窗口一起密集插入,怎么能确定谁的某条记录一定在别人的某条记录之前?
xumenger
xumenger
是唯一的,但是出现了乱序
0
vga
vga

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

用 “order by” 


返回顶部
顶部