AC
Alexandru CodreanuMay 18, 2023, 2:06 p.m.

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

QT

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

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.
Никак не могу разобраться.
Буду благодарен в помощи.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

2
PB
  • May 18, 2023, 2:27 p.m.
  • (edited)
  • The answer was marked as a solution.
db->getDatabase().transaction();
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;
}
    AC
    • May 18, 2023, 3:36 p.m.

    Спасибо.

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      S

      C++ - Test 001. The first program and data types

      • Result:53points,
      • Rating points-4
      S

      C++ - Тест 003. Условия и циклы

      • Result:57points,
      • Rating points-2
      g

      C++ - Test 005. Structures and Classes

      • Result:100points,
      • Rating points10
      Last comments
      J
      JonnyJoMay 26, 2023, 2:24 a.m.
      How to make game using Qt - Lesson 2. Animation game hero (2D) Евгений, благодарю!
      Evgenii Legotckoi
      Evgenii LegotckoiMay 25, 2023, 4:49 p.m.
      How to make game using Qt - Lesson 2. Animation game hero (2D) Код на строчка 184-198 вызывает перерисовку области на каждый 4-й такт счётчика. По той логике не нужно перерисовывать объект постоянно, достаточно реже, чем выполняется игровой слот. А слот вып…
      J
      JonnyJoMay 21, 2023, 10:49 p.m.
      How to make game using Qt - Lesson 2. Animation game hero (2D) Евгений, благодарю! Всё равно не совсем понимаю :( Если муха двигает ножками только при нажатии клавиш перемещение, то что, собственно, делает код со строк 184-198 в triangle.cpp? В этих строчка…
      Evgenii Legotckoi
      Evgenii LegotckoiMay 21, 2023, 5:57 p.m.
      How to make game using Qt - Lesson 2. Animation game hero (2D) Добрый день. slotGameTimer срабатывает по таймеру и при каждой сработке countForSteps увеличивается на 1, это не зависит от нажатия клавиш, нажатая клавиша лишь определяет положение ножек, котор…
      J
      JonnyJoMay 20, 2023, 11:27 p.m.
      How to make game using Qt - Lesson 2. Animation game hero (2D) Евгений, здравствуйте! Подскажите, а почему при нажатии одной клавиши переменная countForSteps увеличивается не на 1, на 4, ведь одно действие даёт увеличение этой переменной только на единицу? …
      Now discuss on the forum
      Evgenii Legotckoi
      Evgenii LegotckoiApril 16, 2023, 4:07 p.m.
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Да, это возможно. Но подобные вещи лучше запускать через celery. То есть drf принимает команду, и после этого регистрирует задачу в celery, котроый уже асинхронно всё это выполняет. В противном …
      АБ
      Алексей БобровDec. 15, 2021, 8:03 a.m.
      Sorting the added QML elements in the ListModel I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …
      Evgenii Legotckoi
      Evgenii LegotckoiMarch 29, 2023, 4:11 p.m.
      Замена поля ManyToMany Картинки точно нужно хранить в медиа директории на сервере, а для обращения использовать ImageField. Который будет хранить только путь к изображению на сервере. Хранить изображения в базе данных…
      Evgenii Legotckoi
      Evgenii LegotckoiApril 24, 2023, 3:22 p.m.
      Пакеты данных между сервером и клиентами Привет. Если классы имеют что-то общее в полях, а также общую идеологию и их можно вписать в иерархию наследования, то в первую очередь переписать так, чтобы один базовый класс объединял в…

      Follow us in social networks