powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Postgresql или firebird
12 сообщений из 137, страница 6 из 6
Postgresql или firebird
    #38865583
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сизиф и мартышки,

ну на самом деле скрипт в листинге 3 висел. Пока я коммит в 1 сессии не сделал. Просто здесь этого не показано. На самом деле было так

[FIXED session1]
SQL>insert into t0(id) values(1);

[FIXED session2]
SQL>insert into t0(id) values(2);

[FIXED session3]
SQL>insert into t0(id) values(3);
SQL> set term ^;
SQL> execute block as
CON> begin
CON> in autonomous transaction do
CON> begin
CON> insert into t0(id) values(1);
CON> insert into t0(id) values(2);
CON> insert into t0(id) values(3);
CON> end
CON> end^
висим

[FIXED session1]
commit;

[FIXED session3]
Statement failed, SQLSTATE = 23000
violation of PRIMARY or UNIQUE KEY constraint "PK_T0_ID" on table "T0"
-Problematic key value is ("ID" = 1)
SQL>
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38865588
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше вот так:
Код: 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.
25.
26.
SQL1> select * from q;

          ID 
============ 
           1 
           2 

SQL2> select * from q;

          ID 
============ 
           1 
           2 

SQL1> update q set id = id where id = 1;
SQL2> update q set id = id where id = 2;
SQL1> set term ^;
SQL1> execute block as begin in autonomous transaction do update q set id = id where id = 2; end^
-- висим
SQL2> set term ^;
SQL2> execute block as begin in autonomous transaction do update q set id = id where id = 1; end^
-- висим DeadlockTimeout секунд, потом:
Statement failed, SQLSTATE = 40001
deadlock
-update conflicts with concurrent update
-concurrent transaction number is 208
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38865615
dimitr,

снкс. уже похоже на правду.

к слову
Я просто без всяких автономий имею при дедлоке внятную ошибку дедлока.

например планирую сделать типовой дедлок в 2-х соединениях вот так:

--1 (комментами -- порядок вызова в конкурентной)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN /*TRANSACTION 1*/;
	INSERT INTO t0 VALUEs(1);--1
--BEGIN /*TRANSACTION 1*/;--2
--	INSERT INTO t0 VALUES(2);--2
	INSERT INTO t0 VALUES(2);
--	INSERT INTO t0 VALUEs(1);--2	
COMMIT;	--1
--COMMIT;	--2


--2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
--BEGIN /*TRANSACTION 1*/;
--	INSERT INTO t0 VALUEs(1);--1
BEGIN /*TRANSACTION 1*/;--2
	INSERT INTO t0 VALUES(2);--2
	--INSERT INTO t0 VALUES(2);--1
	INSERT INTO t0 VALUEs(1);--2-- тут выбрасывается ошибка дедлока
COMMIT;	--1
--COMMIT;	--2


но ни до какого коммита ни в одном окне я не добираюсь -- падаю уже на 2-й вставке во 2-й транзакции
(лок-таймаут маленький стоит)
Код: sql
1.
2.
3.
4.
5.
ОШИБКА: обнаружена взаимоблокировка
SQL-состояние: 40P01
Подробности: Процесс 2544 ожидает в режиме ShareLock блокировку "транзакция 1005"; заблокирован процессом 320.
Процесс 320 ожидает в режиме ShareLock блокировку "транзакция 1006"; заблокирован процессом 2544.
Подсказка: Подробности запроса смотрите в протоколе сервера.


после чего успешно коммичу 1-ю транзу (постгрес срубил одну из 2-х вставших в замок)

а вот в случае dblink всё становится нехорошо -- т.е. мне надо тщательно избегать замков ещё на этапе написания
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38866394
таки доведу до некой точки:

то же, но с дблинк
планируем сделать типовой дедлок в 2-х соединениях , уже с автономиями:

--1 (комментами -- порядок вызова в конкурентной)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TRUNCATE t0;

BEGIN /*TRANSACTION 1*/;
	INSERT INTO t0 VALUEs(1);--1
--BEGIN /*TRANSACTION 1*/;--2
	-->dblink-> INSERT INTO t0 VALUES(2);--2
	SELECT dblink_exec ('dbname='||current_database()||' user=postgres password=postgres', 
												-- да, это тестовый интсанс
						$x$INSERT INTO t0 VALUES(2);$x$);
--	INSERT INTO t0 VALUEs(1);--2	
COMMIT;	--1
--COMMIT;	--2


--2
Код: sql
1.
2.



после синхронного вызова dblink висим в очередях на этих вызовах в обоих транзакциях.
смотрим процессы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT pid,xact_start,query from pg_stat_activity  WHERE state<>'idle' order by xact_start;
/*
416;"2015-01-29 11:38:29.824+04";"	SELECT dblink_exec ('dbname='||current_database()||' user=postgres password=postgres',
						$x$INSERT INTO t0 VALUES(2);$x$);"
2524;"2015-01-29 11:38:37.782+04";"	SELECT dblink_exec ('dbname='||current_database()||' user=postgres password=postgres',
			$x$INSERT INTO t0 VALUEs(1)$x$);--2"
604;"2015-01-29 11:38:44.946+04";"INSERT INTO t0 VALUES(2);"
1988;"2015-01-29 11:38:58.463+04";"INSERT INTO t0 VALUEs(1)"
1552;"2015-01-29 11:41:54.602+04";"SELECT pid,xact_start,query from pg_stat_activity  WHERE state<>'idle' order by xact_start;"
*/
-- срубаем один из всатвших в дедлок дблинков:
SELECT pg_cancel_backend(1988);



получаем в сессии 2:
Код: sql
1.
2.
ОШИБКА:  выполнение оператора отменено по запросу пользователя
CONTEXT:  Error occurred on dblink connection named "unnamed": could not execute command.


после чего успешно коммичу 1-ю транзу (постгрес срубил одну из 2-х вставших в замок)

-- дальше можно развернуть активность в разном handjob--стиле, т.к. за неимением женской женщины приходится пользоваться руками --> см. следующий спойлер и далее


для начала дернемся в направлении асинхронного вызова:
асинк
--1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TRUNCATE t0;

BEGIN /*TRANSACTION 1*/;
	INSERT INTO t0 VALUEs(1);--1
--BEGIN /*TRANSACTION 1*/;--2
	-->dblink-> INSERT INTO t0 VALUES(2);--2
	SELECT dblink_connect('asinc','dbname='||current_database()||' user=postgres password=postgres');
	SELECT dblink_send_query ('asinc',
						$x$INSERT INTO t0 VALUES(2);$x$);
--	INSERT INTO t0 VALUEs(1);--2	
COMMIT;	--1
--COMMIT;	--2
-- ниакакого дедлока не возникает (нет скрестного ожидания, есть независимые очереди независимых транзакций):
SELECT * FROM dblink_get_result('asinc') AS t(f text);
/*
ОШИБКА:  повторяющееся значение ключа нарушает ограничение уникальности "t0_pkey"
DETAIL:  Ключ "(id)=(2)" уже существует.
CONTEXT:  Error occurred on dblink connection named "asinc": could not execute query.
*/



--2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--BEGIN /*TRANSACTION 1*/;
--	INSERT INTO t0 VALUEs(1);--1
BEGIN /*TRANSACTION 2*/;--2
	INSERT INTO t0 VALUES(2);--2
	-->dblink-> INSERT INTO t0 VALUES(2);--1
	SELECT dblink_connect('asinc','dbname='||current_database()||' user=postgres password=postgres');
	SELECT dblink_send_query ('asinc',

			$x$INSERT INTO t0 VALUEs(1)$x$);--2 --тут срубаем дедлок руками в 3-й сессии
COMMIT;	--1
--COMMIT;	--2
SELECT * FROM dblink_get_result('asinc') AS t(f text);
/*
ОШИБКА:  повторяющееся значение ключа нарушает ограничение уникальности "t0_pkey"
DETAIL:  Ключ "(id)=(1)" уже существует.
CONTEXT:  Error occurred on dblink connection named "asinc": could not execute query.
*/



-- откуда возникает идея -- если нам нужен синхронный (wait) вызов автономии -- можно вручную (handjob) следить за ожиданиями через асинхронную автономию того же соединения (запустили, передали пиды родителя и синхронного соединения, и забыли -- а оно уж самопалным кодом следит за.) короче -- полный handjob, но всё очевидно решается. Тест--кейс писать не буду, если не возражаете, но то, что все концы [реализации] в руках -- в общем-то очевидно. Это к вопросу об ограниченности возможностей эмуляции. -- возможностей то там докера и больше. Но хенд-джоба немного больше.
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38867246
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!на счет delete from test where test.ID in (select id from test GROUP BY id HAVING count(id)>1);
можете внятно пояснить, что там происходит и чем там может помочь заглядывание в мифический undo log ? уровень изолированности snapshot/serializable DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> recreate table test(id int primary key, x int ); commit;
SQL> insert into test values(1, 100);
SQL> insert into test values(2, 200);
SQL> insert into test values(3, 200);
SQL> insert into test values(4, 300);
SQL> insert into test values(5, 400);
SQL> commit;

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
delete from test
where test.x in (
    select x from test group by x having count(x)>1
);

select * from test;
rollback;

update test
set x = null
where test.x NOT in (
    select x from test
    group by x
    having count(x)=1
);

select * from test;
rollback;

Result in Firebird 2.5:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> delete from test
CON> where test.x in (
CON>     select x from test group by x having count(x)>1
CON> );
SQL> select * from test;

          ID            X
============ ============
           1          100
           3          200
           4          300
           5          400

SQL> rollback;


SQL> update test
CON> set x = null
CON> where test.x NOT in (
CON>     select x from test
CON>     group by x
CON>     having count(x)=1
CON> );
SQL> select * from test;

          ID            X
============ ============
           1          100
           2       <null>
           3          200
           4          300
           5          400

SQL> rollback;

Result in Firebird 3.0:
Код: 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.
25.
26.
27.
28.
29.
30.
SQL> delete from test
CON> where test.x in (
CON>     select x from test group by x having count(x)>1
CON> );
SQL> select * from test;

          ID            X
============ ============
           1          100
           4          300
           5          400

SQL> rollback;
SQL> update test
CON> set x = null
CON> where test.x NOT in (
CON>     select x from test
CON>     group by x
CON>     having count(x)=1
CON> );
SQL> select * from test;

          ID            X
============ ============
           1          100
           2       <null>
           3       <null>
           4          300
           5          400

SQL> rollback;
(TIL значения не имеет).
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38872945
?-?-?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skidline, только firebird ,
да, не забудьте прочесть доку - от 4 интербейс (на новел, os/2 - не обращать внимания) до 3 файрбёрд,
да, чейндж логи тоже ...,
а ещё, книженция классная есть ...... тётка какая-то написала, в нужной ветке есть ...

postgresql - да - модно, да - много пиара, да - ...., аля "оракле"
но, ни док, ни вменяемого комьюнити, ни девелоперов ...
каждый год какую-то версию выпускают, а толку нет.
ни пакетов, ни автономных транзакций, ни материализованных представлений,
матвьюхи и партиционирование - курям ("ораклу") на смех ...
даже "merge" - не могут доделать ...
а инкрементальный бэкап ... капец ...

да, к чему этот вопрос, у вас чё 100 терабайтные базы ... да ну на!!!, в аксцессе !!!

ФАЙРБЕРД ПОБЕДИТ ЛЮБОЙ АКСЦЕСС!!!

(если нужны шкурки/вершки - delphi, если нужны деньги - java/c/objective c/c++/...)

пля, а причём тут деньги ... да на одно-цэ и пахапэ можно заколотить!

главное спец, а не трёп, точней - спеца продать,точней - найти покупателя ...
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38872964
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?-?-?postgresql - да - модно, да - много пиара, да - ...., аля "оракле"
но, ни док, ни вменяемого комьюнити, ни девелоперов ...


Мягко скажем это ложь.
Документация по PostgreSQL самая вменяемая из всех OpenSource проектов.
Причем всегда актуальная.
Единственная проблема, что русская документация отстает, но в английской документации такой простой язык, что это не вызывает проблем.
Насчет комьюнити и девелоперов...
Так PostgreSQL просто работает.
Соответственно комьюнити не так "видно", как в других проектах, где ответы надо искать не в документации, а на форумах комьюнити :-)
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38872998
mad_nazgul?-?-?postgresql - да - модно, да - много пиара, да - ...., аля "оракле"
но, ни док, ни вменяемого комьюнити, ни девелоперов ...


Мягко скажем это ложь.
Документация по PostgreSQL самая вменяемая из всех OpenSource проектов.
Причем всегда актуальная.
Единственная проблема, что русская документация отстает, но в английской документации такой простой язык, что это не вызывает проблем.
Насчет комьюнити и девелоперов...
Так PostgreSQL просто работает.
Соответственно комьюнити не так "видно", как в других проектах, где ответы надо искать не в документации, а на форумах комьюнити :-)?-?-? -- очевидный шезойд
а это вот всё, с очевидностью, -- было его обострение йумора.
сраказм, т.н.

не надо спорить с больным
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38873009
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сизиф и мартышки?-?-? -- очевидный шезойд
а это вот всё, с очевидностью, -- было его обострение йумора.
сраказм, т.н.

не надо спорить с больным

Ну, тред могут читать люди которые слабо знают PostgeSQL и ?-?-?, так что это скорее для них, чем ответ для ?-?-?.
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38873190
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?-?-?да, не забудьте прочесть доку - от 4 интербейс (на новел, os/2 - не обращать внимания) до 3 файрбёрд,
да, чейндж логи тоже ...,
это не обязательно, потому что мы недавно выпустили русское руководство по языку SQL Firebird (для 2.5).
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38873705
?-?-?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сизиф и мартышкиmad_nazgulпропущено...


Мягко скажем это ложь.
Документация по PostgreSQL самая вменяемая из всех OpenSource проектов.
Причем всегда актуальная.
Единственная проблема, что русская документация отстает, но в английской документации такой простой язык, что это не вызывает проблем.
Насчет комьюнити и девелоперов...
Так PostgreSQL просто работает.
Соответственно комьюнити не так "видно", как в других проектах, где ответы надо искать не в документации, а на форумах комьюнити :-)?-?-? -- очевидный шезойд
а это вот всё, с очевидностью, -- было его обострение йумора.
сраказм, т.н.

не надо спорить с больным
Телепат? Да, ты прав то был сарказм.

Но, почему ты (ивини что на "ты") такой злобный, у тя три ведра никав на форуме ... жена/любовница не даёт?
...
Рейтинг: 0 / 0
Postgresql или firebird
    #38873707
?-?-?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv...
это не обязательно, потому что мы недавно выпустили русское руководство по языку SQL Firebird (для 2.5).
спасибо, но уже не нужно, нужно было 5-10 лет назад ....
...
Рейтинг: 0 / 0
12 сообщений из 137, страница 6 из 6
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Postgresql или firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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