PDA

Ver la Versión Completa : como emplear la transacciones


Arturo
13-04-2006, 20:16:56
saludos, he comprendido como usar las transaccion con zeos en un bloque try.. except pero no entiendo en donde poner el bendito codigo, es decir escribirlo en los eventos onnewrecord, beforeedit, beforedelete.
cuando ejecuto un tabla.append delphi sabe que hay que agregar un registro es correcto realizarlo de esta manera o en de que modo, he encontrado un codigo en este foro el cual menciona que lo resolvio.
Si alguin sabe como emplearlo o de que manera se los agradeceria, ya que los dbedit estan vinculados a las tablas por tal motivo si yo ejecuto un edit habo mis cambios en mis dbedit's y lugo hago un post me afecta los cambios quisiera saber en donde introdusco las transacciones eso es semejante cuando se trate del maestro/detalle.

try

//Preparamos la transacción
DataSet.SQL.Clear;
DataSet.SQL.Add('SET AUTOCOMMIT = 0');
DataSet.Execute;

//Inicializamos la transacción
DataSet.SQL.Clear;
DataSet.SQL.Add('start transaction');
DataSet.Execute;

//Seleccionamos el registro a modificar con propiedades correctas
DataSet.SQL.Clear;
DataSet.SQL.Add('SELECT * FROM tabla LOCK IN SHARE MODE');
DataSet.Execute;

//Actualizamos los datos del campo correspondiente
DataSet.SQL.Clear;
DataSet.SQL.Add('UPDATE tabla SET');
DataSet.SQL.Add('campoDB=datosAct');
DataSet.SQL.Add('WHERE condicion<>0');
DataSet.Execute;

//Finalizamos la transacción
DataSet.SQL.Clear;
DataSet.SQL.Add('commit');
DataSet.Execute;

//Restauramos las propiedades originales
DataSet.SQL.Clear;
DataSet.SQL.Add('SET AUTOCOMMIT = 1');
DataSet.Execute;

except

on E: Exception do begin
//Deshacemos los pasos de la transacción
DataSet.SQL.Clear;
DataSet.SQL.Add('RollBack');
DataSet.Execute;

end;

JCarlosas
27-04-2006, 22:29:45
Hola Arturo.
Yo realmente nunca he utilizado las transacciones con ZesLib y MySQL, pero supongo que trabajen igual o muy parecido a como se hace con Interbase.
El objeto TZconnection
Posee los siguientes metodos/propiedades.

TransactIsolationLevel
StartTransaction
Commit
Rollback

Supongo que se deban usar de forma parecida a como se hace con ADO y MS SQL Server con cuando se usa Interbase.

O sea llamas primero a
StartTransaction
realizas los cambios y/o inserciones que necesites en la BD
Si todo fue OK entonces llamas al
Commit
Para que dichos cambies sean efectivos a otros usuarios en la BD
Si algo fue mal y necesitas hechar todo para atras desde el inicio de las transacciones llamas entonces a
RollBack

La propiedad TransactIsolationLevel, debe darte un determinado nivel de aislamiento respecto a las consultas concurrentes con la tuya. Habria que leerse un poco la ayuda pero debe tener algun valor implicito o por omision.
Otra cosa y muy importante.
Las tablas de MySQL tienen que ser del tipo innoDB y nunca MyISAM porque estas ultimas no admiten transacciones.
Bueno cuando lo pruebes, si te funciona me gustaria ver un fragmento de codigo de ejemplo en el foro.

Chao y suerte.
Juan Carlos

Arturo
28-04-2006, 20:09:29
saludos a todos pero ya hace tiempo que no encaraba como usar las transacciones y desde luego con algunas respuestas del club he elegido usar ado para mysql y odbc con algunos intentos ya puede manejarla y como dices JCarlosas coloque el codigo en el componente datasource iniciando la Transaccion:

if not conex.intransaction then
conex.isolationlevel:='ilReadCommitted'
conex.BeginTrans;
y listo luego lo confirmo desde algun boton

quizas me digan que no es asi en ese componente pero me detueve resolviendo esto