Несколько запросов к БД в рамках одной транзакции

Рейтинг: 0Ответов: 1Опубликовано: 18.05.2023

Как правильно выполнить запросы в рамках одной транзакции?

db->getDatabase().transaction();
QString str_error;
QSqlQuery qry;
//** 1
qry.prepare("INSERT ...");
if (qry.exec())
    str_error = str_error + qry.lastError().text();
//** 2
qry.prepare("INSERT ...");
if (qry.exec())
    str_error = str_error + qry.lastError().text();
//** 3
qry.prepare("INSERT ...");
if (qry.exec())
    str_error = str_error + qry.lastError().text();

if (str_error.isEmpty())
    db->getDatabase().commit();
else
    db->getDatabase().rollback();

... к примеру если во втором запросе ошибка, то в любом случае выполняются 1 и 3.

Ответы

▲ 0

Нашел ответ.

QString str_error;
QSqlQuery qry;
bool success = true;
try {
  qry.prepare("INSERT ...");
  if (!qry.exec()) {
      str_error = str_error + qry.lastError().text();
      success = false;
  }
  qry.prepare("INSERT ...");
  if (!qry.exec()) {
      str_error = str_error + qry.lastError().text();
      success = false;
  }
  qry.prepare("INSERT ...");
  if (!qry.exec()) {
      str_error = str_error + qry.lastError().text();
      success = false;
  }
  if (success)
      db->getDatabase().commit();
  else
      db->getDatabase().rollback();
}
catch (...) {
  db->getDatabase().rollback();
  throw;
}