我注意到QSqlDatabase文档说
"注意:使用事务时,必须在创建查询之前启动事务。 "
如果您必须仅在开始事务后创建查询,这是否会限制 QSqlQuery::prepare() 在事务情况下的有用性?在这里提出了同样的问题……但没有提供令人满意的答案。
我的另一个问题是,如果您使用QSqlQuery::prepare()准备查询并调用QSqlQuery::finish(),是否应该再次准备查询?我问这个是因为在文档中没有提到准备好的查询以防QSqlQuery::finish()。
我注意到QSqlDatabase文档说
"注意:使用事务时,必须在创建查询之前启动事务。 "
如果您必须仅在开始事务后创建查询,这是否会限制 QSqlQuery::prepare() 在事务情况下的有用性?在这里提出了同样的问题……但没有提供令人满意的答案。
我的另一个问题是,如果您使用QSqlQuery::prepare()准备查询并调用QSqlQuery::finish(),是否应该再次准备查询?我问这个是因为在文档中没有提到准备好的查询以防QSqlQuery::finish()。
事务的要点是能够执行几个不同的查询,其中只有在一切正常的情况下才会提交数据库更改。
考虑以下代码结构(伪代码):
startTransaction()
try
{
insertParentDataset(parent);
insertChildDataset(child1);
insertChildDataset(child2);
commitTransaction();
}
catch
{
rollbackTransaction()
}
像这样结构的代码将确保每个查询只有在前一个查询有效的情况下才会执行,并且如果出现任何错误,try { }
块中的方法造成的每个更改都将被忽略,即数据库仍然在同一个像以前一样状态。
由于这些原因,我只在修改数据库时使用事务,而不是在读取它们时使用。
准备或不准备查询的决定是完全不同的事情。您通常准备查询以提高大量数据插入的性能或防止用户进行 SQL 注入(可能有更多原因),但这不会影响事务的行为。从事务的角度来看,执行“正常”查询或准备好的查询都没有关系。
关于finish()
,我从未使用过。对于不同的查询,使用不同的 QSqlQuery 对象通常会更方便。