请问一个多客户端数据库插入问题。

时间:2022-09-12 20:12:08
sql2000  N客户端。n<100.

每客户端有插入按钮一个。 点击的时候 向数据库某表(表字段ID(自增),NID)

插入新纪录一条。 并确保NID唯一。

单个没有任何问题。

但是现在客户端设置 一次可插入多条记录。

比如10000条。 在客户端A插入10000条记录的过程里  客户端B插入一条。 这就导致了 A得到的NID不连续。

请问如何确保每客户端得到的NID 不论多少条都是连续的。

11 个解决方案

#1


顶一下。

#2


在插入记录时,先加锁,用乐观锁或悲观锁都可以。

#3


有意思的问题....
在插入记录时,先加锁,用乐观锁或悲观锁都可以。对于这种处理方式包括使用事务得到的结果都是当一个客户在插入时其他的客户不可以插入甚至有可能会报超时

解决问题的关键就是使用临时插入,然后在真正插入的方法,两次插入法...
假设A表是实际要求插入的表,那建一个B表作为临时插入表..
B表中应该比A表中多一列信息标识插入的批次..比如可以使用GUID
作为3层结构的应用来说,插入的流程步骤应该是这样的.

   Client                  App Server                      SQL Server
1 我要向数据库插入数据->     OK 你可以插入数据     
2 插入数据1 +唯一标识g->      OK 数据1放入B表          ->         数据1+唯一标识g 放入B表
3 插入数据2 +唯一标识g->      OK 数据2放入B表          ->         数据2+唯一标识g 放入B表
4 插入数据n +唯一标识g->      OK 数据n放入B表          ->         数据n+唯一标识g 放入B表
5 数据插入完成                 OK 将B表中的数据批次
                               转移到 A表 where 唯一标识=g

对于SQL的批次由B表插入到A表的SQL不会不会写吧..

刚看了问题的点数 可有点少啊...^_^

#4


呵呵 谢楼上的。
分加就是。

但是如果没有App   Server 该如何?

#5


没有APP Server,就再数据库中开临时表就行了

#6


up

#7


没有APP就更好做了
Client                                      SQL   Server 
1   插入数据1+唯一标识g- >                数据1+唯一标识g   放入B表 
2   插入数据2+唯一标识g- >                数据2+唯一标识g   放入B表 
3   插入数据n+唯一标识g- >                 数据n+唯一标识g   放入B表 
4   数据插入完成 
     数据库事务开始
     将B表中的数据批次 
     转移到   A表   where   唯一标识=g 
    数据库事务完成
                                  
                                                            

#8


好像还是不对。

假设 1和n 为2条记录,并且是客户端a 一次插入的。
客户端a 占据 b表中的 1和N这2条记录。  客户端B占据2这条记录。 

那。a这一次的NID 仍然不连续。 因为客户端B在 A插入2条记录中间插入了一条。

我只是想保证。不论A/B/C/D  每一次插入(大于一条记录时)都能得到一批连续的NID  这个NID不会因为  其他的客户端受到干扰。

也许是我太菜。不能理解各位的意思。 烦请说明。谢~

#9


要用事务阿...
4       数据插入完成   
          数据库事务开始 
          将B表中的数据批次   
          转移到       A表       where       唯一标识=g   
        数据库事务完成 
在B表中不要考虑NID,写入B表中的数据不需要NID

A表中使用NID啊..

#10


明白了  呵呵 谢谢你。

#11


一个帖子发出5天后,才可以给帖子进行加分操作,否则不允许加分 
只有帖主或者版主才可以给帖子进行加分 
一个帖子只能加分一次,加分限制为100分 
给帖子加分后,帖子过期时间延后15天 
...........


然后是无权。。。。  不好意思了。

#1


顶一下。

#2


在插入记录时,先加锁,用乐观锁或悲观锁都可以。

#3


有意思的问题....
在插入记录时,先加锁,用乐观锁或悲观锁都可以。对于这种处理方式包括使用事务得到的结果都是当一个客户在插入时其他的客户不可以插入甚至有可能会报超时

解决问题的关键就是使用临时插入,然后在真正插入的方法,两次插入法...
假设A表是实际要求插入的表,那建一个B表作为临时插入表..
B表中应该比A表中多一列信息标识插入的批次..比如可以使用GUID
作为3层结构的应用来说,插入的流程步骤应该是这样的.

   Client                  App Server                      SQL Server
1 我要向数据库插入数据->     OK 你可以插入数据     
2 插入数据1 +唯一标识g->      OK 数据1放入B表          ->         数据1+唯一标识g 放入B表
3 插入数据2 +唯一标识g->      OK 数据2放入B表          ->         数据2+唯一标识g 放入B表
4 插入数据n +唯一标识g->      OK 数据n放入B表          ->         数据n+唯一标识g 放入B表
5 数据插入完成                 OK 将B表中的数据批次
                               转移到 A表 where 唯一标识=g

对于SQL的批次由B表插入到A表的SQL不会不会写吧..

刚看了问题的点数 可有点少啊...^_^

#4


呵呵 谢楼上的。
分加就是。

但是如果没有App   Server 该如何?

#5


没有APP Server,就再数据库中开临时表就行了

#6


up

#7


没有APP就更好做了
Client                                      SQL   Server 
1   插入数据1+唯一标识g- >                数据1+唯一标识g   放入B表 
2   插入数据2+唯一标识g- >                数据2+唯一标识g   放入B表 
3   插入数据n+唯一标识g- >                 数据n+唯一标识g   放入B表 
4   数据插入完成 
     数据库事务开始
     将B表中的数据批次 
     转移到   A表   where   唯一标识=g 
    数据库事务完成
                                  
                                                            

#8


好像还是不对。

假设 1和n 为2条记录,并且是客户端a 一次插入的。
客户端a 占据 b表中的 1和N这2条记录。  客户端B占据2这条记录。 

那。a这一次的NID 仍然不连续。 因为客户端B在 A插入2条记录中间插入了一条。

我只是想保证。不论A/B/C/D  每一次插入(大于一条记录时)都能得到一批连续的NID  这个NID不会因为  其他的客户端受到干扰。

也许是我太菜。不能理解各位的意思。 烦请说明。谢~

#9


要用事务阿...
4       数据插入完成   
          数据库事务开始 
          将B表中的数据批次   
          转移到       A表       where       唯一标识=g   
        数据库事务完成 
在B表中不要考虑NID,写入B表中的数据不需要NID

A表中使用NID啊..

#10


明白了  呵呵 谢谢你。

#11


一个帖子发出5天后,才可以给帖子进行加分操作,否则不允许加分 
只有帖主或者版主才可以给帖子进行加分 
一个帖子只能加分一次,加分限制为100分 
给帖子加分后,帖子过期时间延后15天 
...........


然后是无权。。。。  不好意思了。