2010-04-28 8 views
16

Ho cercato di trovare informazioni sul Web in merito alle differenze tra queste dichiarazioni e mi sembra che siano identiche ma non riesco a trovare conferma di ciò o qualsiasi tipo di confronto tra i due.SQL Server BEGIN/END vs BEGIN TRANS/COMMIT/ROLLBACK

Qual è la differenza tra il fare questo:

BEGIN 
    -- Some update, insert, set statements 
END 

e facendo questo

BEGIN TRANS 
    -- Some update, insert, set statements 
COMMIT TRANS 

?

Si noti che esiste solo la necessità di eseguire il rollback in caso di alcune eccezioni o timeout o altri errori generali, non ci sarebbe un motivo condizionale per il rollback.

+1

Il ** prima * * la posizione da leggere sulla sintassi di SQL Server è Documentazione in linea, la documentazione fornita con SQL Server. –

+1

non è stata contrassegnata una risposta accettata, ma sono sicuro spero tu capisca la differenza, sono piuttosto diversi. Senza comprendere questo punto fondamentale, ti manca uno dei punti più fondamentali di SQL. –

risposta

26

BEGIN e END gestiscono blocchi di codice. Sono simili alle parentesi graffe che si vedono in molte lingue:

if (somethingIsTrue) 
{ // like BEGIN 
    // do something here 
} // like END 

In SQL, questo è:

if somethingIsTrue 
BEGIN 
    -- do something here 
END 

BEGIN TRAN, COMMIT e ROLLBACK iniziano e finiscono transazioni. Non specificano un nuovo blocco di codice; segnano solo i confini della transazione.

Nota che è possibile scrivere un BEGIN TRAN e COMMIT in blocchi di codice separati. Ad esempio, se si desidera che il codice di far parte di una transazione, ma non si desidera avviare una nuova, se il codice è già in una transazione, si può fare qualcosa di simile:

declare @TranStarted bit = 0 
if @@trancount = 0 
begin 
    set @TranStarted = 1 
    begin tran 
end 

-- ... do work ... 

if @TranStarted = 1 
begin 
    commit 
    set @TranStarted = 0 
end 
+1

Penso che dire che sono "simili al costrutto" se "potrebbe essere un po 'fuorviante. Mi piace la similitudine di @Mike Mooney "come bretelle {} in C#/C++/Java" –

+0

Grazie. Ho risolto il post. –

2

Queste 2 affermazioni sono completamente diverse.

BEGIN..END segno un blocco di codice, ad esempio in un'istruzione if

IF @something = 1 
BEGIN 
    -- Do something when @something is equal to 1 
END 

BEGIN TRANS..COMMIT TRANS avvolgere il blocco racchiude in una transazione, e, a seconda delle impostazioni del server sarà il rollback della transazione se si verifica un errore.

4

Il regolare BEGIN e END non vengono utilizzati per le transazioni. Invece, sono solo per indicare che un certo blocco di codice è una singola unità, molto simile a parentesi graffe {} in C#/C++/Java.

Se si dispone di un'istruzione IF o di un ciclo WHILE che esegue 10 operazioni, è necessario includerle in BEGIN/END in modo che SQL Server sappia che l'intera lista di 10 istruzioni deve essere eseguita come parte di tale condizione.

2

Va detto che esiste un inizio; in PostgreSQL, anche questo avvia un blocco di transazione, che inizialmente mi ha confuso.

http://www.postgresql.org/docs/9.0/static/sql-begin.html

"BEGIN avvia un blocco di transazione, cioè, tutte le dichiarazioni dopo un comando BEGIN sarà eseguito in una singola transazione fino a quando un esplicito commettere o dato ROLLBACK.Per impostazione predefinita (senza BEGIN), PostgreSQL esegue le transazioni in modalità "autocommit", ovvero ogni istruzione viene eseguita nella propria transazione e un commit viene eseguito implicitamente alla fine dell'istruzione (se l'esecuzione ha avuto esito positivo, altrimenti viene eseguito un rollback)."

0

non ho visto FINE TRANS :)

credo che abbiamo uso finale solo per BEGIN parola chiave non per BEGIN trans usiamo commit o rollback per BEGIN trans