我的程序在我的应用程序中创建Unique Account ID
时创建Accounts
。
Max Account ID
存储在另一个表格中(Table ::MaxAccountID
)。创建用户帐户时,SP会调用此表格获取Max Account ID
。
例如:帐户ID :: MG110000021(110000021,我们从MaxAccountID表中获取)
我们使用TABLOCKX
获取Unique Account ID
,因为在几秒钟内在多个会话中调用了相同的SP。
因此,每个会话都会AccountID
与TABLOCKX
一致。{/ 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
答案 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))。