2011-01-24 30 views

Respuesta

9

confirmar y deshacer tienen diferentes efectos

  • COMMIT decrementos @@ TRANCOUNT
  • ROLLBACK lo empuja de nuevo a cero

Esto sucede porque SQL Server en realidad no admite transacciones anidadas.

Si confirmar o deshacer en un procedimiento almacenado anidado (no transacción), entonces se generará el error 266 debido a una falta de coincidencia @@ TRANCOUNT en el arranque y la entrada

La cuestión de reversión puede ser resuelto mediante el uso de SET XACT_ABORT ON que es "auto rollback" (simplemente) y suprime el error 266.

El problema de la confirmación ... no se puede como tal. Sin embargo, puede controlar dónde sucede al anotar @@ TRANCOUNT en la entrada del proceso almacenado y confirmando solo si es cero.

Para el manejo de transacciones correcta, ver mis respuestas aquí, por favor: Nested stored procedures containing TRY CATCH ROLLBACK pattern? y Have I to count transactions before rollback one in catch block in T-SQL?

2

No puede confirmarlo en un procedimiento anidado, pero al iniciar una transacción se ajustarán todos los procedimientos anidados. Entonces la transacción es buena para todos los procedimientos almacenados anidados dentro de la transacción. En las transacciones distribuidas, la integridad de los datos incluso cruza los límites de la máquina.

http://msdn.microsoft.com/en-us/library/ms188929(v=SQL.90).aspx

0

Debe emparejar su COMENZAR TRAN y se compromete en la misma sproc

Si a continuación, llama a otro procedimiento almacenado que también tiene una transacción, con posterioridad COMENZAR TRAN/COMMIT pares Tran incrementar y disminuir @ @Trancount respectivamente.

La transacción se confirma en el 'último' COMMIT TRAN (@@ TRANCOUNT = 1)

Sin embargo, cualquier ROLLBACK siempre deshacer la transacción.

MSDN tiene una buena explicación.

0

Sí, es posible. Con lenguajes de programación como C#, cuando pasa la conexión y el objeto de transacción con el comando. si algo es tomado como incorrecto que revertir la transacción:

string customerConnection = "Connection"; 
     string query = "insert into temp values ('Data2','data1','data2','data3')"; 
     string query2 = "update tempcst set data = 'Hello data'"; 

     SqlConnection myConnection = new SqlConnection(customerConnection); 
     myConnection.Open(); 


     SqlTransaction myTrans = myConnection.BeginTransaction(); 

Try{ 

     int result = executeNonQuery(query, myConnection, myTrans, ""); 
     i = executeNonQuery(query2, myConnection, myTrans, ""); 
    myTrans.Commit();} 



    catch{ 
     myTrans.Rollback(); 
     myConnection.Close(); 
} 
Cuestiones relacionadas