Postresql SQL State: 25P02 тупик? - PullRequest
1 голос
/ 21 мая 2019

Моя задача - создать тупик с двумя транзакциями SQL. Я работаю в PgAdmin. Задача гласит: «Создайте две транзакции SQL, которые могут быть выполнены интерактивно (комментируйте в комментариях, в каком порядке должны чередоваться транзакции), чтобы создать тупик и объяснить причину тупика. " Я попытался создать его и прочитать об этом в Интернете, но это единственная ошибка, которую я получаю, когда пытаюсь заставить два процесса работать одновременно без COMMIT / ROLLBACK. Я получаю это сообщение об ошибке:

    ERROR:  current transaction is aborted, commands ignored until end of transaction block
    SQL state: 25P02

Если это не тупик, можете ли вы помочь мне сделать его?

http://zarez.net/?p=1069

    CREATE TABLE deadlock_example_table_1 (column1 int)

    CREATE TABLE deadlock_example_table_2 (column1 int)

    INSERT INTO deadlock_example_table_1 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
    GO

    INSERT INTO deadlock_example_table_2 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
    GO

    BEGIN;
    DELETE FROM deadlock_example_table_1 WHERE column1 = 2

    BEGIN;
    DELETE FROM deadlock_example_table_2 WHERE column1 = 2

https://medium.com/@clairesimmonds/postgresql-decoding-deadlocks-183e6a792fd3 Я думал, что результат должен выглядеть примерно так, как в этой статье.

    ERROR: deadlock detected
    DETAIL:  Process 16121 waits for AccessExclusiveLock on relation 17389 of database 16390; blocked by process 15866.
    Process 15866 waits for AccessShareLock on relation 17309 of database 16390; blocked by process 16121.
    HINT:  See server log for query details.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Шаг 1: заполнить

INSERT INTO deadlock_example_table_1 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
go
commit;

Шаг 2: процесс 2, обновить

 update deadlock_example_table_1 set columns1=5 where column1=1;

Шаг 3: обновить процесс 3 (другое командное окно)

 update deadlock_example_table_1 set columns1=7 where column1=2;
 update deadlock_example_table_1 set columns1=4 where column1=1;

Обычно это должно быть заблокировано

шаг 4: возврат к процессу 2

 update deadlock_example_table_1 set columns1=80 where column1=2;

Мёртвая блокировка здесь

Процесс 2 и процесс 3 ДОЛЖНЫ находиться в разных сеансах

0 голосов
/ 21 мая 2019

Должен выполняться одновременно.Откройте два окна и сделайте следующее: Процесс

...