Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите понять логи откуда дедлок происходит / 6 сообщений из 6, страница 1 из 1
22.03.2017, 14:13
    #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
22.03.2017, 15:44
    #39424990
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите понять логи откуда дедлок происходит
westvovik,

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

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


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

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


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

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


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