The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Запросы в транзакции MariaDB выполняются не смотря на ошибки., !*! CHIM, 11-Авг-22, 15:20  [смотреть все]
Доброго времени суток.
Уважаемые знатоки, прошу совета!
Сервер MariaDB 10.5, пишу простенький запрос с транзакцией где данные копируются из одной таблицы в другую и помечаются как архивные, затем удаляются из первоисточника.
Суть в том, что даже работая с одной таблицей, поочерёдно выполняется код и не смотря на то, что есть попытка обновить несуществующую строку, транзакция не отменяется, а выполняется в полном объёме, что до попытки обновления, что после.

SET autocommit = OFF;
START TRANSACTION;
DELETE FROM test2 WHERE pnum=11;/*удаляем на всякий случай*/
INSERT INTO test2(fam,pnum) (SELECT fam,pnum FROM test1 WHERE id =334);/*из test1 копируем строку в test2*/
DELETE FROM test2 WHERE pnum=11;/*удаляем копируемую строку*/
UPDATE test2 SET location='arhiv' WHERE pnum=11;/*пытаемся обновить несуществующую строку*/
INSERT INTO test2(fam,pnum) (SELECT fam,pnum FROM test1 WHERE id =334);/*снова вставляем данную строку*/
COMMIT;
SELECT * FROM test2 WHERE pnum=11;

Не могу понять почему транзакция не отменяет изменения если в одном из запросов ошибка?

  • Запросы в транзакции MariaDB выполняются не смотря на ошибки., !*! Аноним, 06:04 , 14-Авг-22 (1)
    >[оверквотинг удален]
    > INSERT INTO test2(fam,pnum) (SELECT fam,pnum FROM test1 WHERE id =334);/*из test1 копируем
    > строку в test2*/
    > DELETE FROM test2 WHERE pnum=11;/*удаляем копируемую строку*/
    > UPDATE test2 SET location='arhiv' WHERE pnum=11;/*пытаемся обновить несуществующую строку*/
    > INSERT INTO test2(fam,pnum) (SELECT fam,pnum FROM test1 WHERE id =334);/*снова вставляем
    > данную строку*/
    > COMMIT;
    > SELECT * FROM test2 WHERE pnum=11;
    > Не могу понять почему транзакция не отменяет изменения если в одном из
    > запросов ошибка?

    Я давно работал с SQL, но возникает вопрос, почему Вы "не нахождение по WHERE" считаете за ошибку? Это нулевая выборка, которая может вовсе и не рассматриваться как ошибка.

    • Запросы в транзакции MariaDB выполняются не смотря на ошибки., !*! CHIM, 08:18 , 15-Авг-22 (2)
      >[оверквотинг удален]
      >> UPDATE test2 SET location='arhiv' WHERE pnum=11;/*пытаемся обновить несуществующую строку*/
      >> INSERT INTO test2(fam,pnum) (SELECT fam,pnum FROM test1 WHERE id =334);/*снова вставляем
      >> данную строку*/
      >> COMMIT;
      >> SELECT * FROM test2 WHERE pnum=11;
      >> Не могу понять почему транзакция не отменяет изменения если в одном из
      >> запросов ошибка?
      > Я давно работал с SQL, но возникает вопрос, почему Вы "не нахождение
      > по WHERE" считаете за ошибку? Это нулевая выборка, которая может вовсе
      > и не рассматриваться как ошибка.

      А как в таком случае проверяют свои транзакции банки когда добавляют на один счёт 100р и нужно одновременно списать с другого счёта 100р, а если первая операция не прошла, то отменить все операции?

      • Запросы в транзакции MariaDB выполняются не смотря на ошибки., !*! Сергей, 09:37 , 15-Авг-22 (3)
        >[оверквотинг удален]
        >>> COMMIT;
        >>> SELECT * FROM test2 WHERE pnum=11;
        >>> Не могу понять почему транзакция не отменяет изменения если в одном из
        >>> запросов ошибка?
        >> Я давно работал с SQL, но возникает вопрос, почему Вы "не нахождение
        >> по WHERE" считаете за ошибку? Это нулевая выборка, которая может вовсе
        >> и не рассматриваться как ошибка.
        > А как в таком случае проверяют свои транзакции банки когда добавляют на
        > один счёт 100р и нужно одновременно списать с другого счёта 100р,
        > а если первая операция не прошла, то отменить все операции?

        А у них не mySQL(MariaDb) юзается, и обычно в транзакции входят и списание и добавление, если что-то не проходит она и откатывается... Т.е. там все начинается с begin transaction

      • Запросы в транзакции MariaDB выполняются не смотря на ошибки., !*! Непростое кино, 10:37 , 16-Авг-22 (4)
        >[оверквотинг удален]
        >>> COMMIT;
        >>> SELECT * FROM test2 WHERE pnum=11;
        >>> Не могу понять почему транзакция не отменяет изменения если в одном из
        >>> запросов ошибка?
        >> Я давно работал с SQL, но возникает вопрос, почему Вы "не нахождение
        >> по WHERE" считаете за ошибку? Это нулевая выборка, которая может вовсе
        >> и не рассматриваться как ошибка.
        > А как в таком случае проверяют свои транзакции банки когда добавляют на
        > один счёт 100р и нужно одновременно списать с другого счёта 100р,
        > а если первая операция не прошла, то отменить все операции?

        Ну select into where для проверки и if ом ветвить ты можешь?




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру