En el siguiente ejemplo vamos a ver cómo podemos realizar una transacción en MySql. Lo implementaremos en C#.
Para ello vamos a ver el siguiente supuesto: Damos de alta un registro y necesitamos obtener el identificador que le ha correspondido al campo ID
(clave primaria de la tabla, y autonumérico). Para ello tendremos un TableAdapter
con los siguientes dos métodos:
addRegistro
getUltimoID
El motivo de usar transacciones en este supuesto, es para saber con exactitud que el ID
que nos facilita el método getLastID
es el producido por la llamada al método getUltimoID
y no otra llamada concurrente que se haya podido producir.
Inicialmente debemos habilitar el adaptador para permitir transacciones.
Implementaremos un método de ejemplo llamado addRegistro
que constará del siguiente código:
public static Int64 addRegistro(String texto)
{
try
{
dsEjemploTableAdapters.ejemploTableAdapter adaptador
= new Datos.dsEjemploTableAdapters.ejemploTableAdapter();
//Abrimos la conexión
adaptador.Connection.Open();
//Iniciamos la transacción
MySqlTransaction trans = adaptador.Connection.BeginTransaction();
//Realizamos el alta en la tabla ejemplo
adaptador.addRegistro("Hola mundo");
Int64 last_id;
//Obtenemos el ID correspondiente
last_id = adaptador.getLastId().Value;
//Validamos la transacción
trans.Commit();
return (last_id);
}
catch (Exception exc)
{
//Si algo falla, devolvemos -1
return -1;
}
}
Ahora vamos a ver una segunda versión donde haremos un RollBack de la transacción si algo falla:
public static Int64 addRegistro(String texto)
{
dsEjemploTableAdapters.ejemploTableAdapter adaptador
= new Datos.dsEjemploTableAdapters.ejemploTableAdapter();
//Abrimos la conexión
if (adaptador.Connection.State != System.Data.ConnectionState.Open)
{
adaptador.Connection.Open();
}
//Iniciamos la transacción
MySqlTransaction trans = adaptador.Connection.BeginTransaction();
try
{
//Realizamos el alta en la tabla ejemplo
adaptador.addRegistro("Hola mundo");
Int64 last_id;
//Obtenemos el ID correspondiente
last_id = adaptador.getLastId().Value;
//Validamos la transacción
trans.Commit();
return (last_id);
}
catch (Exception exc)
{
//Si algo falla, hacemos el RollBack de la transacción y devolvemos -1
trans.Rollback();
return -1;
}
}