About upgrading a (tuple?) lock in a rollback'd sub-transaction

Started by Amit Langoteabout 12 years ago5 messagesdocsgeneral
Jump to latest
#1Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
docsgeneral

Hi,

Currently there is a warning against the following in manual:

BEGIN;
SELECT * FROM mytable WHERE key = 1 FOR UPDATE;
SAVEPOINT s;
UPDATE mytable SET ... WHERE key = 1;
ROLLBACK TO s;

here: http://www.postgresql.org/docs/9.2/static/sql-select.html

IIUC, it says if the lock-upgrading sub-transaction is rollback'd, as
an undesirable effect, any lock held by the parent transaction is
effectively lost.

A few tests suggest that the lock is still effective for a concurrent
transaction started before the lock-upgrading operation (UPDATE) in
the later savepoint. The lock is forgotten, though, if a concurrent
transaction acquired the lock after the UPDATE on the tuple in the
later savepoint. As soon as the UPDATE is rollback'd, the concurrent
transaction, blind to any lock the parent transaction had on the
tuple, gets the lock.

--------------------------------------------------
1] -- session-1

$ BEGIN;
$ SELECT * FROM mytable WHERE Key = 1 FOR UPDATE

2] -- session-1

$ SAVEPOINT s;
$ UPDATE mytable SET ... WHERE key = 1;

3] -- session-2

$ SELECT * FROM mytable WHERE Key = 1 FOR UPDATE

4] -- session-1

$ ROLLBACK TO s;

5] -- session-2

-- gets the lock and free to modify the tuple (inconistently, off course)
------------------------------------------------------

Although, if [3] were before [2], this wouldn't happen

I know it is still a warned-against usage; but, is it useful to
clarify this nuance of the behavior?

--
Amit

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#2Rob Sargent
robjsargent@gmail.com
In reply to: Amit Langote (#1)
docsgeneral
Re: About upgrading a (tuple?) lock in a rollback'd sub-transaction

And it also tells you how to stop it --bibtex iirc

Sent from my iPhone

On Apr 9, 2014, at 8:41 PM, Amit Langote <amitlangote09@gmail.com> wrote:

Hi,

Currently there is a warning against the following in manual:

BEGIN;
SELECT * FROM mytable WHERE key = 1 FOR UPDATE;
SAVEPOINT s;
UPDATE mytable SET ... WHERE key = 1;
ROLLBACK TO s;

here: http://www.postgresql.org/docs/9.2/static/sql-select.html

IIUC, it says if the lock-upgrading sub-transaction is rollback'd, as
an undesirable effect, any lock held by the parent transaction is
effectively lost.

A few tests suggest that the lock is still effective for a concurrent
transaction started before the lock-upgrading operation (UPDATE) in
the later savepoint. The lock is forgotten, though, if a concurrent
transaction acquired the lock after the UPDATE on the tuple in the
later savepoint. As soon as the UPDATE is rollback'd, the concurrent
transaction, blind to any lock the parent transaction had on the
tuple, gets the lock.

--------------------------------------------------
1] -- session-1

$ BEGIN;
$ SELECT * FROM mytable WHERE Key = 1 FOR UPDATE

2] -- session-1

$ SAVEPOINT s;
$ UPDATE mytable SET ... WHERE key = 1;

3] -- session-2

$ SELECT * FROM mytable WHERE Key = 1 FOR UPDATE

4] -- session-1

$ ROLLBACK TO s;

5] -- session-2

-- gets the lock and free to modify the tuple (inconistently, off course)
------------------------------------------------------

Although, if [3] were before [2], this wouldn't happen

I know it is still a warned-against usage; but, is it useful to
clarify this nuance of the behavior?

--
Amit

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#3Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
In reply to: Rob Sargent (#2)
docsgeneral
Re: [GENERAL] About upgrading a (tuple?) lock in a rollback'd sub-transaction

On Thu, Apr 10, 2014 at 10:25 PM, Rob Sargent <robjsargent@gmail.com> wrote:

And it also tells you how to stop it --bibtex iirc

Yeah, it's a caution against a potentially harmful usage anyway. Users
should not use it at all.

I was just wondering if the description of the behavior, that is,
potential disappearance of certain locks is complete enough.

--
Amit

--
Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-docs

#4Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Amit Langote (#3)
docsgeneral
Re: [GENERAL] About upgrading a (tuple?) lock in a rollback'd sub-transaction

Amit Langote wrote:

On Thu, Apr 10, 2014 at 10:25 PM, Rob Sargent <robjsargent@gmail.com> wrote:

And it also tells you how to stop it --bibtex iirc

Yeah, it's a caution against a potentially harmful usage anyway. Users
should not use it at all.

I was just wondering if the description of the behavior, that is,
potential disappearance of certain locks is complete enough.

You do realize that this is no longer the case in 9.3, right?
I don't see a point in changing old releases' documentation.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-docs

#5Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
In reply to: Alvaro Herrera (#4)
docsgeneral
Re: [GENERAL] About upgrading a (tuple?) lock in a rollback'd sub-transaction

On Fri, Apr 11, 2014 at 11:52 AM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

Amit Langote wrote:

On Thu, Apr 10, 2014 at 10:25 PM, Rob Sargent <robjsargent@gmail.com> wrote:

And it also tells you how to stop it --bibtex iirc

Yeah, it's a caution against a potentially harmful usage anyway. Users
should not use it at all.

I was just wondering if the description of the behavior, that is,
potential disappearance of certain locks is complete enough.

You do realize that this is no longer the case in 9.3, right?
I don't see a point in changing old releases' documentation.

I see, okay.
And yes, I'm aware that this's no longer an issue in 9.3.

Thanks,
Amit

--
Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-docs