2010-04-12 14 views
36

Digamos que tengo un procedimiento almacenado que consiste en varias instrucciones separadas SELECT, INSERT, UPDATE y DELETE. No hay una lógica BEGIN TRANS/COMMIT TRANS/ROLLBACK TRANS explícita.¿Cómo trata SQL Server las instrucciones dentro de los procedimientos almacenados con respecto a las transacciones?

¿Cómo manejará SQL Server este procedimiento almacenado en cuanto a transacciones? ¿Habrá una conexión implícita para cada declaración? ¿O habrá una transacción para el procedimiento almacenado?

Además, ¿cómo podría haberlo descubierto usando T-SQL y/o SQL Server Management Studio?

Gracias!

Respuesta

29

Solo habrá una conexión, es lo que se usa para ejecutar el procedimiento, sin importar la cantidad de comandos SQL dentro del procedimiento almacenado.

dado que no tiene una BEGIN TRANSACTION explícita en el procedimiento almacenado, cada instrucción se ejecutará por sí sola sin posibilidad de deshacer ningún cambio si hay algún error.

Sin embargo, si antes de llamar al procedimiento almacenado emite BEGIN TRANSACTION, todas las declaraciones se agrupan dentro de una transacción y pueden ser COMMITted o ROLLBACKed después de la ejecución del procedimiento almacenado.

Desde dentro del procedimiento almacenado, puede determinar si se está ejecutando dentro de una transacción al verificar el valor de la variable de sistema @@TRANCOUNT (Transact-SQL). Un cero significa que no hay transacción, cualquier otra cosa muestra el nivel de transacciones anidado en el que se encuentra. Dependiendo de la versión del servidor SQL, también puede usar XACT_STATE (Transact-SQL).

Si hace lo siguiente:

BEGIN TRANSACTION 

EXEC my_stored_procedure_with_5_statements_inside @Parma1 

COMMIT 

todo dentro del procedimiento está cubierto por la transacción, los 6 estados (EXEC es una declaración cubierto por la transacción, 1 + 5 = 6). Si hace esto:

BEGIN TRANSACTION 

EXEC my_stored_procedure_with_5_statements_inside @Parma1 
EXEC my_stored_procedure_with_5_statements_inside @Parma1 

COMMIT 

todo dentro de las dos llamadas a procedimientos están cubiertos por la transacción, los 12 estados (los 2 EXEC son a la vez comunicado cubierto por la transacción, 1 + 5 + 1 + 5 = 12).

+0

Entonces, ¿dices que, en efecto, cada instrucción dentro del procedimiento almacenado forma su propia transacción, es decir, se ejecuta un procedimiento almacenado con cinco instrucciones en cinco transacciones? – Sleepless

+0

Si no hay ninguna transacción en el procedimiento o fuera del procedimiento, entonces cada declaración en el procedimiento es una unidad de trabajo autónoma. Realmente no hay transacciones, ya que no puedes comprometer ni tirar, luego retroceder. Si ajusta una llamada a procedimiento en una transacción, todo dentro del procedimiento se ejecutará dentro de esa única transacción. –

+0

¡Gracias! Por cierto, ¿cómo haces ese formato de código en el que obviamente fallé? – Sleepless

1

Puede averiguarlo solo mediante la creación de un pequeño procedimiento almacenado que hace algo simple, por ejemplo, insertar un registro en una tabla de prueba. Entonces comienza Tran; ejecutar sp_test; Retroceder; Es el nuevo disco allí? Si es así, el SP ignora la transacción externa. Si no, entonces el SP es solo otra declaración ejecutada dentro de la transacción (que estoy bastante seguro de que es el caso).

Cuestiones relacionadas