QSqlDatabase事务,QSqlQuery创建和QSqlQuery完成

时间:2013-08-19 04:49:28

标签: sql qt transactions qt5 qtsql

我注意到QSqlDatabase文档说明了

注意:使用交易时,您必须在创建查询之前启动交易。

如果您必须在启动事务后才创建查询,这是否会限制QSqlQuery :: prepare()在事务中的用处?有同样的问题被问到here ......但没有提供令人满意的答案。

我的另一个问题是,如果您使用QSqlQuery::prepare()准备查询并致电QSqlQuery::finish(),是否应该再次准备查询?我问这个是因为在文档中QSqlQuery::finish()的情况下没有提到准备好的查询。

1 个答案:

答案 0 :(得分:2)

事务的要点是能够执行几个不同的查询,只有在一切正常的情况下才会提交数据库更改。

考虑以下代码结构(伪代码):

startTransaction()
try
{
    insertParentDataset(parent);
    insertChildDataset(child1);
    insertChildDataset(child2);
    commitTransaction();
}
catch
{
    rollbackTransaction()
}

这样构造的代码将确保每个查询仅在前一个查询有效时执行,并且在出现任何错误的情况下,try { }块中的方法所造成的每个更改都将被忽略,即数据库仍然处于以前的状态。

出于这些原因,我只在修改数据库时使用事务,而不是在中读取时使用事务。

您准备或不准备查询的决定是完全不同的。您通常准备查询以提高海量数据插入的性能或阻止用户进行SQL注入(可能有更多原因),但这不会影响事务的行为。从事务的角度来看,执行“正常”查询或准备查询无关紧要。

关于finish(),我从未使用过它。对不同的查询使用不同的QSqlQuery对象通常更方便。