Cómo realizar transacciones con una base de datos DB2
Las transacciones son un grupo de operaciones de base de datos combinadas en una unidad lógica de trabajo y se usan para controlar y mantener la coherencia e integridad de cada base de datos a pesar de los errores que pueden producirse en el sistema. Una transacción consta de una serie de instrucciones SELECT, INSERT, UPDATE o DELETE de SQL. Si no se produce ningún error durante una transacción, todas las modificaciones de la transacción se convierten en una parte permanente de la base de datos. Si se producen errores, no se realiza ninguna de las modificaciones en la base de datos.
Una transacción se considera local cuando consta de una única fase y la base de datos la controla directamente. Las transacciones se consideran distribuidas cuando se coordinan mediante un monitor de transacciones y utilizan mecanismos a prueba de errores (como confirmación en dos fases) en la resolución de transacciones.
Nota
Las transacciones son más eficientes cuando se realizan en el servidor. Si está trabajando con una base de datos de SQL Server que hace un uso exhaustivo de transacciones explícitas, debe considerar la posibilidad de escribirlas como procedimientos almacenados mediante la instrucción TRANSACT-SQL BEGIN TRANSACTION.
Las transacciones se controlan con el MsDb2Connection
objeto . Puede iniciar una transacción local con el método BeginTransaction
. Una vez que haya iniciado una transacción, puede inscribir un comando en esa transacción con la Transaction
propiedad de un MsDb2Command
objeto . Luego, puede confirmar o revertir las modificaciones realizadas en el origen de datos según el resultado correcto o incorrecto de los componentes de la transacción.
Hay tres comandos básicos para las transacciones: BEGIN, COMMIT y ROLLBACK. La instrucción BEGIN marca el principio de una transacción. Todos los procedimientos intentados después de la instrucción BEGIN se consideran parte de la transacción, que se completa mediante la instrucción COMMIT o cancelada por la instrucción ROLLBACK.
Para realizar una transacción
Llame
MsDb2Connection.BeginTransaction
a para marcar el inicio de la transacción.BeginTransaction
devuelve una referencia a la transacción. Conserve esta referencia para poder asignarla a los comandos que están inscritos en la transacción.Asigne la transacción al objeto que se va a
MsDb2Command.Transaction
ejecutar.Si se ejecuta un comando en una conexión con una transacción activa y el
Transaction
objeto no se ha asignado a laTransaction
propiedad deCommand
, se produce unaMsDb2Exception
excepción .Ejecute los comandos necesarios.
Llame
MsDb2Transaction.Commit
a para completar la transacción o llameMsDb2Transaction.Rollback
a para cancelar la transacción.Si la conexión se cierra o elimina antes de que se hayan ejecutado los métodos
Commit
oRollback
, la transacción se revierte.En el ejemplo de código siguiente se muestra cómo realizar una transacción.
static void TransactionConnection()
{
MsDb2Connection myConnection new MsDb2Connection(@"file name=HOST.udl ");
myConnection.Open();
// Start a local transaction.
MsDb2Transaction myTrans = myConnection.BeginTransaction();
// Enlist the command in the current transaction.
MsDb2Command myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (MsDb2Exception ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
"was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
Console.ReadLine();
myConnection.Close();
}
}
// End TransactionConnection