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.)

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top