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