高并发MSSQL数据库,在增加记录前,程序均先判断数据库是否存在了某个值,但是在这种情况下,总有重复的值被加进来,该如何解决?

解决方案 »

  1.   

    你最起码要有个主键吧?没有主键怎么判断重复呢?可以考虑加一个Identity列
      

  2.   

    我没说清楚,应该不是插入记录,是更新记录,比如,update tab set a='1,2,3,4...',后面的'1,2,3,4...'是更新的值,不能有重复的,比如现在老被更新成类似'1,2,2,3,4...'等等的,就不对了,我举个例子而已,希望大家知道我的意思就行了。我在更新前都判断了,这个字段是否有这个的值了,但是还有被增加进来重复的。
      

  3.   

    这个在数据库里比较难实现,因为你需要锁定的是还不存在的值,而不是已经存在的记录。比如现在第一个会话里需要把某条记录的这个字段改为'111',而另一个会话中需要把另一条记录的这个字段也改成‘111’,由于是并发的更新操作,在更新时这2个会话,确实会分别锁定它们各自需要修改的那条记录,但是这2条记录的这个字段的值,就都改为了‘111’。所以如果需要update后,这个字段的值在整个表中不重复,那么需要考虑的就是如何顺序化分配update时的这个新的值'xxx',如果第一个会话需要update这个表里的一条记录,那么给他分配'111',而第二个会话也需要update这个表里的另一条记录,那么就给他分配成'222',这样才能使得不重复。所以像上面说的,如果在客户端做控制,就是在每次更新值时,需要更新的值,都有一个线程集中分配,这样才有可能使得update的值不重复
      

  4.   

    如果不在客户端控制,那么就在这个字段上建一个唯一索引:create unique index 索引名称 on 表名称(更新的这个字段)
      

  5.   

    大家还是理解错了。
    更新的时候,是这样,每次增加进来一个数值,比如原来是1,2,现在更新后可以是1,2,3,或者是1,2,4,但是不能是类似的1,2,2,或者1,2,3,3这样的,因为,2或3值中已经存在了。目前的情况是,老存在这样重复的,我更新前,先是select这个字段,看看是否存在了这个数值,存在就不增加到后面,否则就增加到后面,可是现在总是偶尔就增加进来个重复的。
      

  6.   

    declare @str varchar(20)
    set @str='3,'
    update TB set F=F+'3,'
    where charindex(','+@str,F)=0
    这样就会不重复了