Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock
От | Tatsuo Ishii |
---|---|
Тема | Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock |
Дата | |
Msg-id | 20190614.073229.1432207886733966773.t-ishii@sraoss.co.jp обсуждение исходный текст |
Ответ на | pgsql: Avoid spurious deadlocks when upgrading a tuple lock (Alvaro Herrera <alvherre@alvh.no-ip.org>) |
Ответы |
Re: pgsql: Avoid spurious deadlocks when upgrading a tuple lock
|
Список | pgsql-committers |
I am a little bit confused. Here T1 and X are the same transaction? Best regards, -- Tatsuo Ishii SRA OSS, Inc. Japan English: http://www.sraoss.co.jp/index_en.php Japanese:http://www.sraoss.co.jp > Avoid spurious deadlocks when upgrading a tuple lock > > When two (or more) transactions are waiting for transaction T1 to release a > tuple-level lock, and transaction T1 upgrades its lock to a higher level, a > spurious deadlock can be reported among the waiting transactions when T1 > finishes. The simplest example case seems to be: > > T1: select id from job where name = 'a' for key share; > Y: select id from job where name = 'a' for update; -- starts waiting for X > Z: select id from job where name = 'a' for key share; > T1: update job set name = 'b' where id = 1; > Z: update job set name = 'c' where id = 1; -- starts waiting for X > T1: rollback; > > At this point, transaction Y is rolled back on account of a deadlock: Y > holds the heavyweight tuple lock and is waiting for the Xmax to be released, > while Z holds part of the multixact and tries to acquire the heavyweight > lock (per protocol) and goes to sleep; once X releases its part of the > multixact, Z is awakened only to be put back to sleep on the heavyweight > lock that Y is holding while sleeping. Kaboom. > > This can be avoided by having Z skip the heavyweight lock acquisition. As > far as I can see, the biggest downside is that if there are multiple Z > transactions, the order in which they resume after X finishes is not > guaranteed. > > Backpatch to 9.6. The patch applies cleanly on 9.5, but the new tests don't > work there (because isolationtester is not smart enough), so I'm not going > to risk it. > > Author: Oleksii Kliukin > Discussion: https://postgr.es/m/B9C9D7CD-EB94-4635-91B6-E558ACEC0EC3@hintbits.com > > Branch > ------ > REL_11_STABLE > > Details > ------- > https://git.postgresql.org/pg/commitdiff/85600b7b5da42c5166eb1188c173beb3cc356178 > > Modified Files > -------------- > src/backend/access/heap/README.tuplock | 10 ++ > src/backend/access/heap/heapam.c | 84 +++++++++--- > .../expected/tuplelock-upgrade-no-deadlock.out | 150 +++++++++++++++++++++ > src/test/isolation/isolation_schedule | 1 + > .../specs/tuplelock-upgrade-no-deadlock.spec | 57 ++++++++ > 5 files changed, 281 insertions(+), 21 deletions(-) >
В списке pgsql-committers по дате отправления: