query SQL Server Inserisci per un forum
-
08-10-2019 - |
Domanda
Considerando un tavolo forum e molti utenti inserendo contemporaneamente i messaggi in esso, quanto è sicuro questa transazione?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
DECLARE @LastMessageId SMALLINT
SELECT @LastMessageId = MAX(MessageId)
FROM Discussions
WHERE ForumId = @ForumId AND DiscussionId = @DiscussionId
INSERT INTO Discussions
(ForumId, DiscussionId, MessageId, ParentId, MessageSubject, MessageBody)
VALUES
(@ForumId, @DiscussionId, @LastMessageId + 1, @ParentId, @MessageSubject, @MessageBody)
IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION
RETURN 0
END
ROLLBACK TRANSACTION
RETURN 1
Qui ho letto ultima MessageId e incrementarlo. Io campo di identità non posso usare perché ha bisogno di essere incrementato per ogni messaggio inserito in un gruppo (non tutti i messaggi di inserimento nella tabella.)
Soluzione
La transazione dovrebbe essere abbastanza sicuro anzi - Vai alle MSDN sul SERIALIZABLE livello di transazione :
SERIALIZABLE
Specifica il seguente:
Dichiarazioni non possono leggere i dati che sono stati modificati , ma non ancora commessi da altre operazioni.
Non ci sono altre transazioni possono modificare i dati che è stata letta dal transazione corrente fino a quando la corrente Completa di transazione.
Altre operazioni non può inserire nuove righe con valori chiave che cadrebbe nella gamma di chiavi leggere da tutte le dichiarazioni nella corrente operazione fino a quando la corrente Completa di transazione.
blocchi di intervallo vengono inseriti nella gamma dei valori chiave che corrispondono al le condizioni di ogni dichiarazione cercare eseguito in una transazione. questo blocca altre operazioni di aggiornamento, oppure inserendo le righe che si qualificano per qualsiasi istruzioni eseguite dal la transazione corrente. Questo significa che se una qualsiasi delle dichiarazioni in un transazioni vengono eseguite una seconda tempo, che leggeranno lo stesso insieme di filari. I blocchi di intervallo vengono mantenuti fino al completamento della transazione. Questo è il più restrittiva dell'isolamento Livelli perché blocca intere gamme delle chiavi e le serrature tiene fino alla Completa di transazione. Perché la concorrenza è più bassa, utilizzare questa opzione solo quando necessario. Questa opzione ha lo stesso effetto come imposta sul HOLDLOCK tutte le tabelle in tutte le istruzioni SELECT in una transazione.
Il problema principale di questo livello di isolamento delle transazioni è che si tratta di un pesante carico abbastanza sul server, e serializza (come dice il nome) qualsiasi accesso, in modo che le prestazioni del server e la scalabilità soffriranno, per esempio con un numero molto elevato di utenti, avrete probabilmente ottenere un sacco di timeout per gli utenti in attesa di una transazione alla fine.
Quindi, utilizzando l'approccio più leggero di un messaggio id globale come INT IDENTITY
è sicuramente molto meglio!