none
关于数据库两条一样的数据的疑问 RRS feed

  • 问题

  • 先说明下我的表结构:
    AccountKey uniqueidentifer Primary key,
    AccountID   VARCHAR(50)
    Regdate      DATETIME


    这是一张用户的注册表。
    但发现有奇怪的现象。
    注册页面调用sp往表插入数据。而且做逻辑判断。
    IF Not EXISTS (SELECT 1 FROM Table WHERE AccountID=@AccountID)
    BEGIn
        INSERT INTO  TABLE (AccountKey,AccountID,Regdate)  VALUES(NEWID(),@AccountID,GETDATE())
    END


    但这样还出现两条除了主键AccountKey之外,其他都一样的数据。注册时间也一模一样。

    用的数据库是sqlserver 2005
    我想知道是否数据库里存在什么机制。导致了Insert的时候有两条数据。(从存储过程逻辑来判断,这个不是调用两次存储过程的症状)

    注册表数据可能比较大。而且还有其他读写更频繁的数据库都布在一台机器上。

    跪求答案。。。。。。。。。。。。。。
    • 已编辑 Lich_gbc 2010年2月23日 9:12
    2010年2月23日 8:33

答案

  • 在AccountID 上建立 唯一约束 就能避免这个问题。

    可能是用户提交的时候连续点了2次提交导致的。
    family as water
    • 已标记为答案 Lich_gbc 2010年2月24日 3:15
    2010年2月23日 9:12
  • May happen if many people run same function at same time. Better to let sql handle uniqueness.
    • 已标记为答案 Lich_gbc 2010年2月24日 3:15
    2010年2月23日 14:02

全部回复

  • IF Not EXISTS (SELECT 1 FROM Table WHERE AccountID=@AccountID)
    BEGIn
        INSERT INTO  TABLE (AccountKey,AccountID,Regdate)  VALUES(NEWID(),@AccountID,GETDATE())
    END
    用Not EXISTS

    ROY WU(吳熹)
    2010年2月23日 8:53
    版主
  • 不好意思。。打错了。我用的 是 Not EXISTS..
    还是谢谢你的回答

    2010年2月23日 8:57
  • 在AccountID 上建立 唯一约束 就能避免这个问题。

    可能是用户提交的时候连续点了2次提交导致的。
    family as water
    • 已标记为答案 Lich_gbc 2010年2月24日 3:15
    2010年2月23日 9:12
  • 谢谢你提供的解决方案。我会尝试下的。

    用户连续点击。这个在程序里用 js控制点击一次后按钮不可用了。
    再这也不符合存储过程逻辑啊。存储过程里已经用NOT EXISTS 判断了。

    2010年2月23日 9:27
  • May happen if many people run same function at same time. Better to let sql handle uniqueness.
    • 已标记为答案 Lich_gbc 2010年2月24日 3:15
    2010年2月23日 14:02
  • IF Not EXISTS (SELECT 1 FROM Table WHERE AccountID=@AccountID)
    BEGIn
        INSERT INTO  TABLE (AccountKey,AccountID,Regdate)  VALUES(NEWID(),@AccountID,GETDATE())
    END

    除非你用显式事务并且用xlock, holdlock,否则高并发时仍然可能出现AccountID重复的数据。


    想不想时已是想,不如不想都不想。

    2014年12月7日 13:58
    版主