Обсуждение: triggers, transactions and locks
Dear All,
Is there a way to use locks within a trigger? My example below gives the error:
ERROR: unexpected error -8 in EXECUTE of query "BEGIN"
CONTEXT: PL/pgSQL function "insert_into_t1" line 6 at execute statement
Thanks
Colin
CREATE FUNCTION insert_into_t1() RETURNS trigger AS'
DECLARE
set_qry text;
BEGIN
set_qry:=''BEGIN WORK'';
execute set_qry;
LOCK t1;
INSERT INTO t2 VALUES (11);
COMMIT;
RETURN NEW;
END;
' LANGUAGE 'plpgsql' SECURITY DEFINER;
CREATE TRIGGER insert_into_t1 BEFORE INSERT
ON t1 FOR EACH ROW EXECUTE
PROCEDURE insert_into_t1();
On Mon, Dec 06, 2004 at 03:41:07PM -0000, Colin Gillespie wrote: > Is there a way to use locks within a trigger? My example below gives the error: > ERROR: unexpected error -8 in EXECUTE of query "BEGIN" > CONTEXT: PL/pgSQL function "insert_into_t1" line 6 at execute statement As Stephan Szabo already mentioned in response to your post in pgsql-general, the problem isn't with the lock but rather with your attempt to start and end a transaction within a function. Can you tell us what you're trying to do? Why do you want to lock the table but not hold the lock until the outer transaction ends? -- Michael Fuhr http://www.fuhr.org/~mfuhr/
>> Is there a way to use locks within a trigger? My example below gives >> the error: >> ERROR: unexpected error -8 in EXECUTE of query "BEGIN" >> CONTEXT: PL/pgSQL function "insert_into_t1" line 6 at >execute statement >Can you tell us what you're trying to do? Why do you want to >lock the table but not hold the lock until the outer transaction ends? Hi Michael, In my trigger after an update, the trigger scans the table and creates a row new row with one the counters going from i=i+1. However, I've found that if two updates occur together then two identical rows can be created. Hence, I thought of locking the table within the trigger. I presume from your email that the best way would be to lock the table from the beginning of the transaction? Thanks Colin > >-- >Michael Fuhr >http://www.fuhr.org/~mfuhr/ >