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



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

Reply via email to