Verrouillage d'une table SQL Server pour empêcher les insertions

J'écris cette procédure dans SQL Server 2008 R2:

CREATE Procedure [dbo].[SetLocalSeed](@tableName nvarchar(128)) AS BEGIN -- Find the primary key column name DECLARE @pkName NVARCHAR(128) SELECT @pkName = COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1 AND TABLE_NAME = @tableName BEGIN TRANSACTION -- Find the max LOCAL pk value (< 10^7) - hold the lock until the transaction completes. DECLARE @max BIGINT DECLARE @sql NVARCHAR(MAX) = 'SELECT @max = MAX([' + @pkName + ']) FROM [' + @tableName + '] WITH (TABLOCKX, HOLDLOCK) WHERE [' + @pkName + '] < POWER(10,7)'; EXEC sp_executeSql @sql, N'@max BIGINT OUT', @max=@max OUTPUT -- Reset the seed to the table DBCC CHECKIDENT(@tableName, RESEED, @max) COMMIT END 

Est-ce la bonne façon de verrouiller la table pour les insertions pendant que je fais cette requête et l'identité subséquente reseed? Aussi voudrais savoir s'il y a des problèmes dans ce que je fais ci-dessus? Ceci sera utilisé dans un environnement de réplication personnalisé.

TIA

SQL Server autorise par défaut les lectures incorrectes, tout en n'autorisant pas les écritures endommagées. Pour éviter cela, vous devez verrouiller explicitement la table comme vous l'avez fait. Si vous ne le faites pas, il semble que vous pourriez rencontrer deux users différents pour get la même valeur pour votre variable @sql, s'ils lisent tous les deux dans la table avant que l'un d'entre eux effectue le reseed (alors que Nick a raison). les verrous lors du reseed, vous faites un select en dehors du context du reseed). Donc je pense que vous avez raison.

Vous voudrez aussi regarder cela , pour quelle raison vous devriez inclure votre transaction dans les commands SET_XACT_ABORT_ON / OFF.

vous pouvez également envisager de définir les niveaux d'isolement sur READ COMMITTED dans le server SQL pour lire uniquement datatables validées

 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 

https://msdn.microsoft.com/en-us/library/ms173763.aspx