powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Организация нескольких последовательных запросов в транзакции
10 сообщений из 10, страница 1 из 1
Организация нескольких последовательных запросов в транзакции
    #38900682
Midgard90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрых суток!
Стоит следующая задача: По событию провести несколько последовательных запросов Insert или Update, но в случае чего - с откатом изменений. Что-то типа транзакции. Пытался сделать таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
try
   {adoquery->clear();
    adoquery->add("INSERT....");
    adoquery->ExecSQL();
    adoquery->clear();
    adoquery->add("UPDATE....");
    adoquery->ExecSQL();
    }
catch(...)
    {
    //не вышло
    }


В этом случае, если первый запрос выполнился, а второй заклинило, то выскакивает исключение, но первый уже выполнился, что не допустимо для задачи..
Прочитал что надо использовать связку: BEGIN;COMIT;ROLLBACK; Но нигде не нашёл как использовать, мысли такие:
вариант 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
try
   {adoquery->clear();
    adoquery->add("BEGIN;");
    adoquery->add("INSERT....");
    adoquery->add("UPDATE....");
    adoquery->add("COMMIT;");
    adoquery->ExecSQL();
    }
catch(...)
    {
    //не вышло
    adoquery->add("ROLLBACK;");
    adoquery->ExecSQL();
    }


Вариант 2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
try
   {adoquery->clear();
    adoquery->add("BEGIN;");
    adoquery->ExecSQL();
    adoquery->add("INSERT....");
    adoquery->ExecSQL();
    adoquery->clear();
    adoquery->add("UPDATE....");
    adoquery->ExecSQL();
    adoquery->add("COMMIT;");
    adoquery->ExecSQL();
    }
catch(...)
    {
    adoquery->add("ROLLBACK;");
    adoquery->ExecSQL();
    }


Укажите верный путь, как надо использовать подобные вещи, если можно пример. СУБД postgres, среда Borland 2009
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38900999
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM TADOConnection.BeginTrans, CommitTrans, RollbackTrans.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901030
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Midgard90Прочитал что надо использовать связку: BEGIN;COMIT;ROLLBACK; Но нигде не нашёл как использовать, мысли такие:

Вариант 2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
try
   {adoquery->clear();
    adoquery->add("BEGIN;");
    adoquery->ExecSQL();
    adoquery->add("INSERT....");
    adoquery->ExecSQL();
    adoquery->clear();
    adoquery->add("UPDATE....");
    adoquery->ExecSQL();
    adoquery->add("COMMIT;");
    adoquery->ExecSQL();
    }
catch(...)
    {
    adoquery->add("ROLLBACK;");
    adoquery->ExecSQL();
    }




Так вот так вот (как выше, Вариант 2) и надо их использовать.
Только там наверное не add надо вызывать, а set или что-то такое.
Или

Код: plaintext
1.
2.
3.
4.
5.
6.
    adoquery->clear();
    adoquery->add("BEGIN;");
    adoquery->ExecSQL();
    adoquery->clear();
    adoquery->add("INSERT....");
    adoquery->ExecSQL();



т.е. запрос, который уже выполнился, должен из adoquery удаляться.


Midgard90вариант 1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
try
   {adoquery->clear();
    adoquery->add("BEGIN;");
    adoquery->add("INSERT....");
    adoquery->add("UPDATE....");
    adoquery->add("COMMIT;");
    adoquery->ExecSQL();
    }
catch(...)
    {
    //не вышло
    adoquery->add("ROLLBACK;");
    adoquery->ExecSQL();
    }





т.е. тут идея в том, чтобы сформировать пачку из нескольких запросов, и выполнить их скопом.
Это тоже возможно, и в принципе от варианта 2 это ничем не отличается в смысле транзакций,
за исключением двух моментов:

выполнять по одному оператору удобнее.

не все СУБД позволяют сформировать батч (пачку операторов SQL) для посылки в СУБД для выполнения, и во всех СУБД это делается по-разному. Как -- надо смотреть в документации по СУБД и может быть по используемому CLAPI.
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901034
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovRTFM TADOConnection.BeginTrans, CommitTrans, RollbackTrans.


Идея этого API в том, чтобы вместо операторов типа
START TRANSACTION
COMMIT
ROLLBACK

использовать вызовы этих функций. Это имеет смысл, поскольку операторы управления транзакциями бывают
в разных СУБД немного разными, поэтому использование этих функций имеет смысл, особенно для кросс-СУБД-шных приложений.

Но в принципе они делают то же самое, что и соотв. операторы языка SQL данной СУБД.
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901239
Midgard90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, не думал что всё довольно просто. Как поступил:
ADOQuery привязал к ADOConnection, через него изначально шли все значимые запросы.
В коде сделал следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
try 
    {
    Form5->ADOConnection1->BeginTrans();
    adoquery->clear();
    adoquery->add("INSERT....");
    try
       {
        adoquery->ExecSQL();
       }
    catch.....//Отловил, что ошибка в первом запросе
    adoquery->clear();
    adoquery->add("UPDATE....");
    try
       {
       adoquery->ExecSQL();
       }
    catch......//Отловил, что ошибка во втором запросе
    Form5->ADOConnection1->CommitTrans();
    }
catch(...)
    {
    //не вышло, и указываем из за какого запроса
    Form5->ADOConnection1->RollbackTrans();
    }



На удивление чётко сработало, без рукоблудства в коде. Проверил нарочной ошибкой в запросе. Спасибо за помощь! Весьма признателен!
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901283
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Midgard90На удивление чётко сработало, без рукоблудства в коде.хранимую процедуру на сервере что помешало написать?
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901322
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Midgard90В коде сделал следующее:...
Зачем тебе тут транзакция если RollbackTrans() никогда не сработает? Т.к. каждый запрос в свой try...catch обернут.
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901327
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Midgard90Да, не думал что всё довольно просто. Как поступил:
ADOQuery привязал к ADOConnection, через него изначально шли все значимые запросы.
В коде сделал следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
try 
    {
    Form5->ADOConnection1->BeginTrans();
    adoquery->clear();
    adoquery->add("INSERT....");
    try
       {
        adoquery->ExecSQL();
       }
    catch.....//Отловил, что ошибка в первом запросе
    adoquery->clear();
    adoquery->add("UPDATE....");
    try
       {
       adoquery->ExecSQL();
       }
    catch......//Отловил, что ошибка во втором запросе
    Form5->ADOConnection1->CommitTrans();
    }
catch(...)
    {
    //не вышло, и указываем из за какого запроса
    Form5->ADOConnection1->RollbackTrans();
    }



На удивление чётко сработало, без рукоблудства в коде. Проверил нарочной ошибкой в запросе. Спасибо за помощь! Весьма признателен!


try/catch-а хватит и одного на весь блок.
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901338
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗачем тебе тут транзакция если RollbackTrans() никогда не сработает? Т.к. каждый запрос в свой try...catch обернут.то есть, думаешь, throw из catch-блока очень сложно сделать, да? ))
Хотя, конечно, лучше так:
MasterZivtry/catch-а хватит и одного на весь блок
...
Рейтинг: 0 / 0
Организация нескольких последовательных запросов в транзакции
    #38901342
Midgard90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, переборщил) общего try хватило.. Но с каждым обёрнутым тоже работает, только откатывает транзакцию сразу чуть в каком запросе не вышло. Матрёшка своего рода)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Организация нескольких последовательных запросов в транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]