2010-04-28 44 views
16

He estado tratando de encontrar información en la web sobre las diferencias entre estas declaraciones, y me parece que son idénticas pero no puedo encontrar la confirmación de eso o cualquier tipo de comparación entre los dos.SQL Server BEGIN/END vs BEGIN TRANS/COMMIT/ROLLBACK

¿Cuál es la diferencia entre hacer esto:

BEGIN 
    -- Some update, insert, set statements 
END 

y haciendo esto

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

?

Tenga en cuenta que solo existe la necesidad de deshacer en el caso de alguna excepción o tiempo de espera u otro error general, no habría una razón condicional para deshacer.

+1

La primera ** * * lugar para leer la sintaxis de SQL Server es Books Online, la documentación que viene con SQL Server. –

+1

no ha marcado una respuesta aceptada, pero estoy seguro Espero que entiendas la diferencia, son bastante diferentes. Sin entender este punto básico, te falta uno de los puntos más fundamentales de SQL. –

Respuesta

26

COMIENZO y FIN reparto con bloques de código. Son similares a las llaves que se ven en muchos idiomas:

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

En SQL, esto es:

if somethingIsTrue 
BEGIN 
    -- do something here 
END 

BEGIN TRAN, COMMIT y ROLLBACK comienzan y terminan las transacciones . No especifican un nuevo bloque de código; solo marcan los límites de la transacción.

Tenga en cuenta que puede escribir un BEGIN TRAN y COMMIT en bloques de código separados. Por ejemplo, si desea que el código sea parte de una transacción, pero usted no desea iniciar una nueva si el código ya está en una transacción, se puede hacer algo como esto:

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

Creo que decir que son "similares a la construcción 'si' puede ser un poco engañoso. Me gusta el símil de @Mike Mooney "como llaves {} en C#/C++/Java" –

+0

Gracias. Yo arreglé la publicación. –

2

Estas 2 declaraciones son completamente diferentes.

BEGIN..END marca de un bloque de código, por ejemplo, en una sentencia if

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

BEGIN TRANS..COMMIT TRANS envolver el bloque que lo contiene en una transacción, y dependiendo de la configuración del servidor va a deshacer la transacción si se produce un error.

4

La regulares BEGIN y END no se utilizan para transacciones. En cambio, son solo para indicar que algún bloque de código es una sola unidad, muy parecido a las llaves {} en C#/C++/Java.

Si tiene una instrucción IF o un bucle WHILE que hace 10 cosas, debe encerrarlas en BEGIN/END para que SQL Server sepa que toda esa lista de 10 instrucciones se debe ejecutar como parte de esa condición.

2

Cabe mencionar que hay un Comienzo; en PostgreSQL, que también inicia un bloque de transacción, que al principio me confundió.

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

"BEGIN inicia un bloque de transacción, es decir, todas las declaraciones después de un comando BEGIN se ejecutará en una sola transacción hasta que un compromiso explícito o se da ROLLBACK.Por defecto (sin BEGIN), PostgreSQL ejecuta transacciones en modo "autocommit", es decir, cada sentencia se ejecuta en su propia transacción y se realiza implícitamente una ejecución al final de la declaración (si la ejecución fue exitosa, de lo contrario se realiza una reversión)."

0

no he visto FIN tRANS :)

creo que el uso final sólo para COMENZAR palabra clave no para COMENZAR trans que utilizamos para confirmar o deshacer COMENZAR trans

Cuestiones relacionadas