Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
dev:qt:qt_ibase_fix_commit [2015/05/20 14:25] denis [the problem] |
dev:qt:qt_ibase_fix_commit [2015/05/20 14:41] (текущий) denis [the solution] |
||
---|---|---|---|
Строка 31: | Строка 31: | ||
QSqlQuery q(sql, db); // blocked forever... | QSqlQuery q(sql, db); // blocked forever... | ||
</code> | </code> | ||
+ | |||
+ | ==== the solution ==== | ||
+ | Edit file ''.../qtbase/src/sql/drivers/ibase/qsql_ibase.cpp'': | ||
+ | <code cpp> | ||
+ | bool QIBaseDriver::commitTransaction() | ||
+ | { | ||
+ | Q_D(QIBaseDriver); | ||
+ | if (!isOpen() || isOpenError()) | ||
+ | return false; | ||
+ | if (!d->trans) | ||
+ | return false; | ||
+ | |||
+ | isc_commit_transaction(d->status, &d->trans); | ||
+ | // d->trans = 0; | ||
+ | // return !d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Unable to commit transaction"), | ||
+ | // QSqlError::TransactionError); | ||
+ | |||
+ | bool res = !d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Unable to commit transaction"), | ||
+ | QSqlError::TransactionError); | ||
+ | if( !res ) | ||
+ | isc_rollback_transaction(d->status, &d->trans); | ||
+ | |||
+ | d->trans = 0; | ||
+ | |||
+ | return res; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== ps ==== | ||
+ | Prefer explicit transation **start** and **commit** as shown above because it is not possible to avoid this problem executing queries with implicit transaction control. | ||
+ |