Hola, si trabajas con tClientDataSet no hacen falta las transacciones, tu código sería el siguiente:
Código Delphi
[-]if clientdataset.applyupdates(0) <> 0 then
clientdataset.CancelUpdates;
esto lo que hace es descartar los cambios en el caso de que ApplyUpdates devuelva errores en la actualización de los datos ( el valor 0 implica que no se toleran errores, -1 implica que se tragará los errores y guardará solo lo correcto ). Si te interesa saber visualmente cuales han sido los errores, entonces tienes que declarar en el
Uses la Unit
RecError, y en el evento OnReconcileError, añadir el código:
Action := HandleReconcileError( DataSet, UpdateKind, E );
Ademas, si lo deseas, puedes modificar la Unit RecError guardandola con otro nombre, para si lo deseas, cambiar el idioma o la presentación.
Un saludo