FireDAC引擎上的SQLite数据库不考虑回滚

FireDAC引擎上的SQLite数据库不考虑回滚,sqlite,delphi,transactions,rollback,firedac,Sqlite,Delphi,Transactions,Rollback,Firedac,我在Delphi(Delphi10.1)应用程序中有一个数据访问对象(DAO)。我创建了与SQLite数据库的连接,选择一些数据(简单的select子句),然后使用TFDQuery组件的ExecSQL()方法执行update子句。数据库中的数据未更改 然后,我在连接中执行rollback()方法。数据库中的数据尚未更改 因此,我在连接中执行close()方法。数据库中的数据已更改 我不知道这是否是FireDAC和SQLite的预期行为,但我认为不应该 一些代码: FFDConnection

我在Delphi(Delphi10.1)应用程序中有一个数据访问对象(DAO)。我创建了与SQLite数据库的连接,选择一些数据(简单的select子句),然后使用TFDQuery组件的ExecSQL()方法执行update子句。数据库中的数据未更改

然后,我在连接中执行rollback()方法。数据库中的数据尚未更改

因此,我在连接中执行close()方法。数据库中的数据已更改

我不知道这是否是FireDAC和SQLite的预期行为,但我认为不应该

一些代码:

FFDConnection                  := TFDConnection.Create(nil);
FFDConnection.Params.Database  := 'database.db3';
FFDConnection.Params.UserName  := '';
FFDConnection.Params.Password  := '';
FFDConnection.Params.DriverID  := 'SQLite';
FFDConnection.Open();

FFDQuery            := TFDQuery.Create(nil);
FFDQuery.Connection := FFDConnection;

FFDConnection.StartTransaction();
// ... Some update code ...
FFDConnection.Rollback();
FFDConnection.Close();
FFDConnection.Free();
FFDConnection.Rollback()之后但在
FFDConnection.Close()之前数据库中的数据仍然没有更改。在
FFDConnection.Close()之后数据库中的数据已更改

这是SQLite的问题吗

我真的很感激你能提供的任何帮助


编辑1:问题是我没有为我的连接创建
TFDTransaction
,因为我认为创建是隐式的。我觉得自己好笨。

不,不是。使用隐式连接事务是可以的。虽然我很难理解你的问题。您没有启动多个事务吗?连接关闭提交很可能是由连接的
TFDTxOptions.DisconnectAction
的默认设置引起的,但似乎有多个事务(我们看不到代码)。内部被回滚,外部被提交(默认的连接关闭动作)。但这只是猜测。在任何情况下,像这样的代码对我来说都毫无意义,你需要做一些更新,以后不管发生什么都要回滚。为什么?问题解决了。我创建了一个
TFDTransaction
对象,并在连接中使用它。问题是,在我更改了一些数据(称为回滚和关闭连接)之后,这些更改被提交,而不是回滚。这不应该发生。仅当您启动内部事务时。在连接对象中应该始终为您分配隐式事务。对我来说这听起来像个虫子。试着重读我写的,也许这就是你的情况。如果不是,就不应该发生。