如何从表中获取不同会话的唯一值

时间:2014-04-22 11:49:35

标签: sql sql-server database sql-server-2008 tsql

我的程序在我的应用程序中创建Unique Account ID时创建Accounts

  • Max Account ID存储在另一个表格中(Table ::MaxAccountID)。
  • 创建用户帐户时,SP会调用此表格获取Max Account ID

    例如:帐户ID :: MG110000021(110000021,我们从MaxAccountID表中获取)

我们使用TABLOCKX获取Unique Account ID,因为在几秒钟内在多个会话中调用了相同的SP。

因此,每个会话都会AccountIDTABLOCKX一致。{/ p>

这没有解决我的问题,我们仍然为不同的会话获得相同(重复)的AccountID。

SELECT @OutPutID = AccountID 
FROM MaxAccountID WITH(TABLOCKX)  
UPDATE MaxAccountID SET AccountID =AccountID +1 

在调用Max AccountID值之前有交易。

BEGIN TRY
BEGIN TRANSACTION
EXEC GetMax_AccountID @OutPutID OUTPUT
INSERT INTO AccountInfo(------------
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

GetMax_AccountID程序包含以下内容,@ OutPutID作为输出参数

SELECT @OutPutID = AccountID 
FROM MaxAccountID WITH(TABLOCKX)  
UPDATE MaxAccountID SET AccountID =AccountID +1 

2 个答案:

答案 0 :(得分:0)

也许这会有所帮助。它将直接返回值。

UPDATE MAXID_Task 
SET ID=ID+1
OUTPUT deleted.ID

如果您需要变量:

DECLARE @Result TABLE (ID int)

UPDATE MAXID_Task 
SET ID=ID+1
OUTPUT deleted.ID
INTO @Result

SELECT @OutPutID = ID FROM @Result

答案 1 :(得分:-1)

就我而言,只有在交易中选择时,独占和共享锁才有效。如果你不这样做,你的with(tablockx)将不会阻止该表。尝试将更新包装在事务中。然后你可以确定一个表被锁定(除非其他一些查询选择了(nolock))。