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