Je veux générer un nombre unique à partir d'une table. Il doit bien sûr être thread sûr, donc quand je vérifie le dernier nombre et obtenir '3', puis stocker '4' dans la base de données, je ne veux pas que quelqu'un d'autre entre ces deux actions (obtenir le nombre et stocker un plus dans la base de données) également obtenir « 3 » en arrière, et puis aussi le stockage « 4 »Serveur sql: Est-ce que l'imbrication dans une transcation est suffisante pour obtenir un numéro unique de la base de données?
donc je pensais, le mettre dans une transaction comme celle-ci:
begin transaction
declare @maxNum int
select @maxNum = MAX(SequenceNumber) from invoice
where YEAR = @year
if @maxNum is null
begin
set @maxNum = 0
end
set @maxNum = @maxNum + 1
INSERT INTO [Invoice]
([Year]
,[SequenceNumber]
,[DateCreated])
VALUES
(@year
,@maxNum
,GETUTCDATE()
)
commit transaction
return @maxNum
Mais je demandé, est-ce suffisant, pour le mettre dans une transaction? ma première pensée était: il verrouille ce sp pour l'utilisation par d'autres personnes, mais est-ce exact? Comment SQL Server peut-il savoir ce qu'il faut verrouiller à la première étape?
Est-ce que cette construction me garantir que personne d'autre fera la partie select @maxnum
juste au moment où je suis updating the @maxnum
valeur, et à ce moment recevant le même @maxnum
comme je l'ai fait, je suis en difficulté.
J'espère que vous comprenez ce que je veux accomplir, et aussi si vous savez si j'ai choisi la bonne solution.
EDIT: également décrit comme « Comment monothread une procédure stockée »
Et pourquoi - oh pourquoi - n'es-tu pas simplement en utilisant une colonne 'IDENTITY' et laisser tous les nicky-gravely tough-as-ongles travailler sur SQL Server ??? –
@marc_s: Prolly car le nombre doit être réinitialisé chaque 'YEAR'. – GSerg
@GSerg: exécuter un 'DBCC CHECKIDENT (table, RESEED, 1)' une fois tous les Janvier 1 et vous avez terminé .... –