AC
Мамыр 18, 2023, 2:06 Т.Қ.

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

QT

Доброго времени суток.
Как правильно выполнить запросы в рамках одной транзакции ?

  1. db->getDatabase().transaction();
  2. QString str_error;
  3. QSqlQuery qry;
  4. //** 1
  5. qry.prepare("INSERT ...");
  6. if (qry.exec())
  7. str_error = str_error + qry.lastError().text();
  8. //** 2
  9. qry.prepare("INSERT ...");
  10. if (qry.exec())
  11. str_error = str_error + qry.lastError().text();
  12. //** 3
  13. qry.prepare("INSERT ...");
  14. if (qry.exec())
  15. str_error = str_error + qry.lastError().text();
  16.  
  17. if (str_error.isEmpty())
  18. db->getDatabase().commit();
  19. else
  20. db->getDatabase().rollback();

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

3

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

2
PB
  • Мамыр 18, 2023, 2:27 Т.Қ.
  • (өңделген)
  • Жауап шешім ретінде белгіленді.
  1. db->getDatabase().transaction();
  2. QString str_error;
  3. QSqlQuery qry;
  4. bool success = true;
  5. try {
  6. qry.prepare("INSERT ...");
  7. if (!qry.exec()) {
  8. str_error = str_error + qry.lastError().text();
  9. success = false;
  10. }
  11. qry.prepare("INSERT ...");
  12. if (!qry.exec()) {
  13. str_error = str_error + qry.lastError().text();
  14. success = false;
  15. }
  16. qry.prepare("INSERT ...");
  17. if (!qry.exec()) {
  18. str_error = str_error + qry.lastError().text();
  19. success = false;
  20. }
  21. if (success)
  22. db->getDatabase().commit();
  23. else
  24. db->getDatabase().rollback();
  25. }
  26. catch (...) {
  27. db->getDatabase().rollback();
  28. throw;
  29. }
    AC
    • Мамыр 18, 2023, 3:36 Т.Қ.

    Спасибо.

      Пікірлер

      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
      Кіріңіз немесе Тіркеліңіз