Page 1 of 1

Work with Transaction

Posted: Wed 15 Feb 2012 08:22
by DarkProgger
Hello. I have some problems with transaction.
Early I'm used FIB and I can do those thing

Code: Select all

Transaction.startTransaction.
DataSet.Appent;
DataSet.FieldByName('ID').AsString:='12345';
DataSet.Post;
DataSet.Edit;
///user something doing in Application
DataSet.FieldByName('Field1').AsString:='12345';
DataSet.FieldByName('Field2').AsString:='67890';
DataSet.FieldByName('Field3').AsString:='54321';
DataSet.Post;
If Save then
   DataSet.Commit
   else
   DataSet.Rollback;
But when I use UniDAC when I use DataSet.Post in Grid appear new record and this record appear in DataBase.
I don't understand how turn off AutoCommit without creating new class(examle i found here on forum, but IMHO it's wrong way).

Posted: Wed 15 Feb 2012 12:05
by AndreyZ
Hello,

To solve the problem, you should use transactions of a dataset. Here is an example:

Code: Select all

UniQuery.Connection := UniConnection;
UniTransaction1.DefaultConnection := UniConnection;
UniTransaction2.DefaultConnection := UniConnection;
UniQuery.SQL.Text := 'select * from tablename';
UniQuery.Transaction := UniTransaction1; // transaction for data reading
UniQuery.UpdateTransaction := UniTransaction2; // transaction for data modifications
UniQuery.Open;
UniQuery.UpdateTransaction.StartTransaction;
UniQuery.Edit;
UniQuery.FieldByName('ID').AsString := '12345';
UniQuery.Post;
UniQuery.UpdateTransaction.Commit;

Posted: Wed 15 Feb 2012 13:02
by DarkProgger
I don't understand why I'm couldn't use one Transaction?

Posted: Wed 15 Feb 2012 14:44
by AndreyZ
InterBase and Firebird require an active transaction for any operation under data. When you open a dataset, one transaction is started to allow you reading data. You cannot use the StartTransaction method for an already started transaction. Therefore, if you want to start a new transaction for data modifying, you have to use another transaction.