transaction - SQL Server BEGIN/END vs BEGIN TRANS/COMMIT/ROLLBACK
sql server tran rollback (5)
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 confirmación de eso ni de ningún tipo de comparación entre las dos.
¿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 revertir en el caso de alguna excepción o tiempo de espera u otra falla general, no habría una razón condicional para revertir.
BEGIN y END tratan 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
inician y finalizan las transacciones . No especifican un nuevo bloque de código; sólo 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 no quiere comenzar uno nuevo si el código ya está en una transacción, 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
Debe mencionarse, que hay un Principio; en PostgreSQL, eso 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án en una sola transacción hasta que se proporcione un COMPROMISO o ROLLBACK explícito. De forma predeterminada (sin BEGIN), PostgreSQL ejecuta transacciones en modo" autocommit ", es decir , cada declaración se ejecuta en su propia transacción y un compromiso se realiza implícitamente al final de la instrucción (si la ejecución fue exitosa, de lo contrario se realiza una reversión) ".
Estas 2 declaraciones son completamente diferentes.
BEGIN..END
marca 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
envuelva el bloque que encierra en una transacción y, dependiendo de la configuración del servidor, se revertirá la transacción si se produce un error.
Los BEGIN y END regulares no se utilizan para transacciones. En su lugar, son solo para indicar que algún bloque de código es una sola unidad, como las llaves {} en C # / C ++ / Java.
Si tiene una declaración IF o un bucle WHILE que hace 10 cosas, debe incluirlas en BEGIN / END para que SQL Server sepa que toda la lista de 10 declaraciones debe ejecutarse como parte de esa condición.
No he visto END TRANS :)
Creo que usamos END solo para la palabra clave BEGIN, no para BEGIN trans, usamos commit o rollback para BEGIN trans