powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите понять логи откуда дедлок происходит
6 сообщений из 6, страница 1 из 1
Помогите понять логи откуда дедлок происходит
    #39424862
westvovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: powershell
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
2017-03-22 01:01:25 +03 pgsql hvo_main LOG:  duration: 67978.076 ms  statement: SELECT clients_to_update_exchange_rate_pgq(16695, ' || TG_OP || ')
2017-03-22 01:02:14 +03 pgsql hvo_main LOG:  duration: 48871.075 ms  statement: SELECT clients_to_update_exchange_rate_pgq(16696, ' || TG_OP || ')
2017-03-22 01:02:19 +03 pgsql hvo_main LOG:  process 79088 still waiting for ShareLock on transaction 385062997 after 2047.176 ms
2017-03-22 01:02:19 +03 pgsql hvo_main DETAIL:  Process holding the lock: 76974. Wait queue: 79088.
2017-03-22 01:02:19 +03 pgsql hvo_main CONTEXT:  while locking tuple (94,3) in relation "orders"
	SQL statement "UPDATE orders SET orders_full_paid = COALESCE(payd, 0) WHERE orders.orders_id = $1"
	PL/pgSQL function orders_full_paid_set(bigint) line 23 at SQL statement
2017-03-22 01:02:19 +03 pgsql hvo_main STATEMENT:  SELECT orders_full_paid_set(o.orders_id) FROM orders o
2017-03-22 01:02:29 +03 pgsql hvo_main LOG:  duration: 14342.439 ms  statement: SELECT clients_to_update_exchange_rate_pgq(16697, ' || TG_OP || ')
2017-03-22 01:02:57 +03 pgsql hvo_main LOG:  process 76974 detected deadlock while waiting for ShareLock on transaction 385062934 after 2010.820 ms
2017-03-22 01:02:57 +03 pgsql hvo_main DETAIL:  Process holding the lock: 79088. Wait queue: .
2017-03-22 01:02:57 +03 pgsql hvo_main CONTEXT:  while locking tuple (19,2) in relation "orders"
	SQL statement "UPDATE public.orders SET 
	    
	    total_sum_rub = total_sum_rub_us,
	    total_sum_commis_rub = client_total_commis($1, now()::date),
	     
	    total_client_sum_rub = total_sum_rub_client,
	 
	    payd_sum_sub_rub = client_payd.rubles_sub, 
	    payd_sum_rub = client_payd.rubles, 
	    payd_status = 
	      CASE 
	        WHEN client_payd.rubles_sub > total_sum_rub_us AND client_payd.rubles_sub > 0 THEN 'Переплачена'::payd_status
	        WHEN client_payd.rubles_sub = total_sum_rub_us THEN 'Оплачена'::payd_status 
	        WHEN client_payd.rubles_sub > 0 AND client_payd.rubles_sub <  total_sum_rub_us THEN 'Пред оплачена'::payd_status 
	        ELSE 'Не оплачена'::payd_status 
	      END 
	  WHERE orders.orders_id = $1"
	PL/pgSQL function client_update_summ(bigint) line 37 at SQL statement
	SQL statement "SELECT client_update_summ(order_packs_r.orders_id)"
	PL/pgSQL function clients_to_update_exchange_rate_pgq(bigint,character varying) line 67 at PERFORM
2017-03-22 01:02:57 +03 pgsql hvo_main STATEMENT:  SELECT clients_to_update_exchange_rate_pgq(16698, ' || TG_OP || ')
2017-03-22 01:02:57 +03 pgsql hvo_main ERROR:  deadlock detected
2017-03-22 01:02:57 +03 pgsql hvo_main DETAIL:  Process 76974 waits for ShareLock on transaction 385062934; blocked by process 79088.
	Process 79088 waits for ShareLock on transaction 385062997; blocked by process 76974.
	Process 76974: SELECT clients_to_update_exchange_rate_pgq(16698, ' || TG_OP || ')
	Process 79088: SELECT orders_full_paid_set(o.orders_id) FROM orders o
2017-03-22 01:02:57 +03 pgsql hvo_main HINT:  See server log for query details.
2017-03-22 01:02:57 +03 pgsql hvo_main CONTEXT:  while locking tuple (19,2) in relation "orders"
	SQL statement "UPDATE public.orders SET 
	    
	    total_sum_rub = total_sum_rub_us,
	    total_sum_commis_rub = client_total_commis($1, now()::date),
	     
	    total_client_sum_rub = total_sum_rub_client,
	 
	    payd_sum_sub_rub = client_payd.rubles_sub, 
	    payd_sum_rub = client_payd.rubles, 
	    payd_status = 
	      CASE 
	        WHEN client_payd.rubles_sub > total_sum_rub_us AND client_payd.rubles_sub > 0 THEN 'Переплачена'::payd_status
	        WHEN client_payd.rubles_sub = total_sum_rub_us THEN 'Оплачена'::payd_status 
	        WHEN client_payd.rubles_sub > 0 AND client_payd.rubles_sub <  total_sum_rub_us THEN 'Пред оплачена'::payd_status 
	        ELSE 'Не оплачена'::payd_status 
	      END 
	  WHERE orders.orders_id = $1"
	PL/pgSQL function client_update_summ(bigint) line 37 at SQL statement
	SQL statement "SELECT client_update_summ(order_packs_r.orders_id)"
	PL/pgSQL function clients_to_update_exchange_rate_pgq(bigint,character varying) line 67 at PERFORM
2017-03-22 01:02:57 +03 pgsql hvo_main STATEMENT:  SELECT clients_to_update_exchange_rate_pgq(16698, ' || TG_OP || ')
2017-03-22 01:02:57 +03 pgsql hvo_main LOG:  process 79088 acquired ShareLock on transaction 385062997 after 40228.071 ms
2017-03-22 01:02:57 +03 pgsql hvo_main CONTEXT:  while locking tuple (94,3) in relation "orders"
	SQL statement "UPDATE orders SET orders_full_paid = COALESCE(payd, 0) WHERE orders.orders_id = $1"
	PL/pgSQL function orders_full_paid_set(bigint) line 23 at SQL statement
2017-03-22 01:02:57 +03 pgsql hvo_main STATEMENT:  SELECT orders_full_paid_set(o.orders_id) FROM orders o
2017-03-22 01:02:57 +03 pgsql hvo_main ERROR:  current transaction is aborted, commands ignored until end of transaction block
2017-03-22 01:02:57 +03 pgsql hvo_main STATEMENT:  SELECT clients_to_update_exchange_rate_pgq()
2017-03-22 01:03:13 +03 pgsql hvo_main LOG:  duration: 193668.050 ms  statement: SELECT orders_full_paid_set(o.orders_id) FROM orders o
2017-03-22 01:03:31 +03 pgsql hvo_main LOG:  duration: 13621.675 ms  statement: SELECT clients_to_update_exchange_rate_pgq(16694, ' || TG_OP || ')
2017-03-22 01:04:39 +03 pgsql hvo_main LOG:  duration: 67679.426 ms  statement: SELECT clients_to_update_exchange_rate_pgq(16695, ' || TG_OP || ')
...
Рейтинг: 0 / 0
Помогите понять логи откуда дедлок происходит
    #39424990
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
westvovik,

Если вы обновляете в пределах 1 транзакции больше 1 строки в таблице и делаете это в несколько потоков - у вас всегда будут deadlocks возникать и надо уметь это обрабатывать.
Deadlock это такая ошибка которую лучше всего через retry решать.
Иди же всегда обновлять строки таблицы в одной транзакции в одном порядке (например строго по возрастанию id).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите понять логи откуда дедлок происходит
    #40027749
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Максим, если используется
Код: plsql
1.
UPDATE tbl set ... WHERE id IN (...)


id - первичный ключ.
в плане видно, что он используется. Это не гарантирует порядок как в индексе?
...
Рейтинг: 0 / 0
Помогите понять логи откуда дедлок происходит
    #40027763
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_,

Не гарантирует на самом деле.
Практически иногда да но там очень от много чего оно зависит.
Нет вообще никакого метода гарантировать порядок обновления строк в многострочном update кроме как хранимку с построчным обновлением в цикле писать или учить код retry операции на deadlock.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Помогите понять логи откуда дедлок происходит
    #40027795
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_
Это не гарантирует порядок как в индексе?

Пока единственное надежное средство от deadlock, которое я нашел - это правильное использование advisory lock.
...
Рейтинг: 0 / 0
Помогите понять логи откуда дедлок происходит
    #40028021
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128, Максим, спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите понять логи откуда дедлок происходит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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