0

我在 Windows 服务器上有一些用户的数据库记录。其中一列是用户的 SID(该用户的唯一字符串)。

当我收到用户的消息时,我想首先对具有 SID 列的 SID 值的记录执行查询。如果没有返回记录,则使用该 SID 值创建记录。但是,在查询和添加之间,另一个线程可以获得具有相同用户/SID 的消息。所以我最终可能会添加两次。

  1. 有没有办法创建一个事务,在事务完成之前不能将其他记录添加到表中?

  2. 或者有没有更好的方法来锁定整个表,因为无论查询/添加多快,这都是一个瓶颈。(如果这是最好的方法,我可以在没有事务的情况下查询,如果存在则返回,只有在极少数情况下不存在,然后事务,再次查询,添加。)

  3. 有没有办法告诉 SQL Server 该列是唯一的?我假设在 SQL Server Management Studio 中禁用的设置属性是因为它是一个varchar.

谢谢 - 戴夫

4

1 回答 1

0

您可以在列上创建唯一索引以强制列上值的唯一性,并且您可以使用以下代码将其调整为您的数据库规范, Warring由于我已将事务隔离级别设置为 SERIALIZABLE,如果出现以下情况,它可能会减慢查询速度多个用户尝试添加数据,因为当此事务隔离级别设置为 SERIALIZABLE 时,它不允许其他用户更改或添加数据到表中...

CREATE Procedure usp_InsertSID
@SID varchar(225)

AS
BEGIN
  SET NOCOUNT ON;
    BEGIN TRY

           IF @SID IS NULL
             RAISERROR('Validation Failed: SID is cannot be null', 16,1)

           IF EXISTS (SELECT SID from tableName
                        WHERE SID= @SID)
              RAISERROR('Validation Failed: SID already Exists',16,1)
        SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
        BEGIN TRANSACTION

          INSERT INTO tableName(ColumnNames)
          VALUES (@SID)

          COMMIT TRANSACTION
        SELECT @ReturnMessage = 'Sucess! New SID is added.'
    END TRY

    BEGIN CATCH 
       IF (@@TRANCOUNT > 0)
         ROLLBACK TRAN

       SELECT  @ReturnMessage = ERROR_MESSAGE()

          SELECT @ReturnCode AS ReturnCode, @ReturnMessage AS ReturnMessage,
                 ERROR_LINE()   AS ErrorLine,
                 ERROR_SEVERITY() AS ErrorSeverity,
                 ERROR_STATE() AS ErrorState
    END CATCH
END

GO
于 2013-10-13T23:14:27.077 回答