Re: reliable lock inside stored procedure (SOLVED)

From: Sebastian Böhm <psql(at)seb(dot)exse(dot)net>
To: Richard Huxton <dev(at)archonet(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: reliable lock inside stored procedure (SOLVED)
Date: 2008-11-03 19:42:54
Message-ID: 29004E71-4980-4932-A393-573E00627C24@seb.exse.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-sql

Hi Richard,

thank you for your answer!

Am 03.11.2008 um 12:06 schrieb Richard Huxton:

> Sebastian Böhm wrote:
>> Hi,
>>
>> I have a stored procedure and I need a SHARE ROW EXCLUSIVE lock in
>> this
>> procedure (otherwise data will get corrupted).
>
> OK. PostgreSQL doesn't have "stored procedures" so I guess you're
> talking about a function.

yes

>
>
>> According to the documentation the LOCK statement is useless and will
>> silently fail if not executed inside a transaction. (btw: this sounds
>> dangerous to me)
>
> I'm not sure what you mean here, and I don't think you've understood
> the
> documentation. It's not possible to have a LOCK statement outside of a
> transaction. It's just not meaningful to have a transaction that only
> has a LOCK statement in it.

as postgres does not warn you about this, this may lead to not so easy
to spot bugs.
If you forget to start a transaction and assume that you got a lock
while modifieing a table, you can corrupt data.

>
>
>> Also it is not possible to start a transaction inside a stored
>> procedure.
>
> All functions execute within a transaction. As do all other SELECT,
> UPDATE, INSERT, DELETE, CREATE TABLE etc. If you (or your client
> library) do not supply a BEGIN then the command is treated as though
> BEGIN...COMMIT surrounded it. You can't have nested transactions
> because
> the COMMIT of a subtransaction wouldn't be meaningful. You can use
> SAVEPOINTS to roll back to a known point.

so a call to a function is ALLWAYS a transaction ? good then I have no
problem...

>
>
>> How can I make the code of this stored procedure safe?
>>
>> is there a way to let the procedure fail with an error if not
>> executed
>> within a transaction.
>
> You can't execute outside of a transaction. It's not possible.
>
>> does adding a SAVEPOINT the trick?
>> documentation says that savepoints can only be established inside
>> transactions, but does it fail fatal enough so that the procedure
>> getss
>> aborted? (more fatal than LOCK does?)
>
> I'm not sure I understand what you mean here.

I assumed that a function can be executed without a transaction,
means: every statement in the function is its own transaction. I
understood that this is not the case.

As SAVEPOINTS failes outside of a transaction I could then be used to
detect wether there is a transaction already started or not.

Imagine that you have a function in your code (not a postgres-
function, but a C function) and this functions issues some statements
that may corrupt data if no transaction is already created.
You may then use SAVEPOINT in that c-function to make sure that there
is a transaction started, as SAVEPOINT creates an exception if no
transaction was started.

/sebastian

>
>
> --
> Richard Huxton
> Archonet Ltd
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Zdenek Kotala 2008-11-03 20:36:07 Re: [WIP] In-place upgrade
Previous Message Bruce Momjian 2008-11-03 19:30:01 Re: Updates of SE-PostgreSQL 8.4devel patches (r1168)

Browse pgsql-sql by date

  From Date Subject
Next Message Tom Lane 2008-11-03 21:20:47 Re: [SQL] reliable lock inside stored procedure (SOLVED)
Previous Message Richard Huxton 2008-11-03 11:06:50 Re: reliable lock inside stored procedure