algo for canceling a deadlocked transaction

Started by Thomas Potyabout 8 years ago6 messagesgeneral
Jump to latest
#1Thomas Poty
thomas.poty@gmail.com

Good afternoon,

My question is : In case of a deadlock between 2 transaction, how to know
which transaction will be canceled? Is it predictable?

I have tried to look into sources but i have found nothing. ( probably, i
am the problem)

Regards,

Thomas

#2Stephen Frost
sfrost@snowman.net
In reply to: Thomas Poty (#1)
Re: algo for canceling a deadlocked transaction

Greetings,

* Thomas Poty (thomas.poty@gmail.com) wrote:

My question is : In case of a deadlock between 2 transaction, how to know
which transaction will be canceled? Is it predictable?

The short answer is "it's whichever one detected the deadlock." The
deadlock timeout fires after a lock has been held that long and if a
deadlock is detected then the process detecting it will be canceled.

I'd strongly recommend reviewing your application and addressing
deadlocks by changing how the application acquires locks to be
consistent and to avoid lock escalation instead of worrying about how to
predict a deadlock- a properly designed and written application
shouldn't be causing deadlocks to happen in the first place.

Thanks!

Stephen

#3Thomas Poty
thomas.poty@gmail.com
In reply to: Stephen Frost (#2)
Re: algo for canceling a deadlocked transaction

Hello Stephen,

The short answer is "it's whichever one detected the deadlock." The
deadlock timeout fires after a lock has been held that long and if a
deadlock is detected then the process detecting it will be canceled.

ok, and long answer ? is it random?

I'd strongly recommend reviewing your application and addressing
deadlocks by changing how the application acquires locks to be
consistent and to avoid lock escalation instead of worrying about how to
predict a deadlock- a properly designed and written application
shouldn't be causing deadlocks to happen in the first place.

I didn't want to predict the deadlock happening. I only want to know if it
is predictable to know which transaction will be canceled.

Thank you

2018-04-09 15:51 GMT+02:00 Stephen Frost <sfrost@snowman.net>:

Show quoted text

Greetings,

* Thomas Poty (thomas.poty@gmail.com) wrote:

My question is : In case of a deadlock between 2 transaction, how to

know

which transaction will be canceled? Is it predictable?

The short answer is "it's whichever one detected the deadlock." The
deadlock timeout fires after a lock has been held that long and if a
deadlock is detected then the process detecting it will be canceled.

I'd strongly recommend reviewing your application and addressing
deadlocks by changing how the application acquires locks to be
consistent and to avoid lock escalation instead of worrying about how to
predict a deadlock- a properly designed and written application
shouldn't be causing deadlocks to happen in the first place.

Thanks!

Stephen

#4Christophe Pettus
xof@thebuild.com
In reply to: Thomas Poty (#3)
Re: algo for canceling a deadlocked transaction

On Apr 9, 2018, at 07:33, Thomas Poty <thomas.poty@gmail.com> wrote:

ok, and long answer ? is it random?

It's not literally random, but from the application point of view, it's not predictable. For example, it's not always the one that opened first, or any other consistent measure.
--
-- Christophe Pettus
xof@thebuild.com

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Christophe Pettus (#4)
Re: algo for canceling a deadlocked transaction

Christophe Pettus <xof@thebuild.com> writes:

On Apr 9, 2018, at 07:33, Thomas Poty <thomas.poty@gmail.com> wrote:
ok, and long answer ? is it random?

It's not literally random, but from the application point of view, it's not predictable. For example, it's not always the one that opened first, or any other consistent measure.

It's whichever one runs the deadlock detector first after the circular
wait becomes established. For instance:

* Process A takes lock L1

* Process B takes lock L2

* Process A tries to take lock L2, blocks

* Process B tries to take lock L1, blocks (now a deadlock exists)

Process A will run the deadlock detector one deadlock_timeout after
blocking. If that happens before B has blocked, then A will see
no deadlock and will go back to waiting. In that case, when B's
own deadlock_timeout expires and it runs the deadlock detector,
it will see the deadlock and fix it by canceling its own wait.
On the other hand, if B started to wait less than one deadlock_timeout
after A did, then A will be first to observe the deadlock and it will
cancel itself, not B.

So you can't predict it unless you have a lot of knowledge about
the timing of events. You could probably make it more predictable
by making deadlock_timeout either very short or very long, but
neither of those are desirable things to do.

regards, tom lane

#6Thomas Poty
thomas.poty@gmail.com
In reply to: Tom Lane (#5)
Re: algo for canceling a deadlocked transaction

Hello Tom,

Thank you for the clarification!

Regards,
Thomas

Le lun. 9 avr. 2018 à 17:04, Tom Lane <tgl@sss.pgh.pa.us> a écrit :

Show quoted text

Christophe Pettus <xof@thebuild.com> writes:

On Apr 9, 2018, at 07:33, Thomas Poty <thomas.poty@gmail.com> wrote:
ok, and long answer ? is it random?

It's not literally random, but from the application point of view, it's

not predictable. For example, it's not always the one that opened first,
or any other consistent measure.

It's whichever one runs the deadlock detector first after the circular
wait becomes established. For instance:

* Process A takes lock L1

* Process B takes lock L2

* Process A tries to take lock L2, blocks

* Process B tries to take lock L1, blocks (now a deadlock exists)

Process A will run the deadlock detector one deadlock_timeout after
blocking. If that happens before B has blocked, then A will see
no deadlock and will go back to waiting. In that case, when B's
own deadlock_timeout expires and it runs the deadlock detector,
it will see the deadlock and fix it by canceling its own wait.
On the other hand, if B started to wait less than one deadlock_timeout
after A did, then A will be first to observe the deadlock and it will
cancel itself, not B.

So you can't predict it unless you have a lot of knowledge about
the timing of events. You could probably make it more predictable
by making deadlock_timeout either very short or very long, but
neither of those are desirable things to do.

regards, tom lane