Mon Jan 18 04:25:10 PST 2010
- Previous message: [Slony1-general] [GENERAL] vacuum issues under load?
- Next message: [Slony1-general] can slony break a transaction with trigger?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hello all,
First of all, I suspect that slony recognizes any SQL operation and
triggered operations as a single transaction, right? For example, I have
some table with records, let's call it "messages" and some table with
messages' categories, like "categories". And I have a row-level trigger
that is fired AFTER insert, update or delete statements on "messages"
and increases/decreases the corresponding counter row in table
"categories", for example:
table messages
----------------
msg_id | category_id | text
1 | 15 | test tralala
2 | 15 | test trututu
3 | 16 | hello
table categories
-----------------
category_id | title | counter
15 | test category | 2
16 | welcomes | 1
CREATE OR REPLACE FUNCTION msgs_upd_counters()
RETURNS SETOF trigger AS
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE categories SET counter=counter-1 WHERE id = OLD.category_id;
EXECUTE 'NOTIFY category'||OLD.category_id::text||'_changed';
END IF;
RETURN OLD;
END IF;
IF (TG_OP = 'UPDATE') THEN
IF (NEW.category_id != OLD.category_id) THEN
UPDATE categories SET counter=counter-1 WHERE id = OLD.category_id;
EXECUTE 'NOTIFY category'||OLD.category_id::text||'_changed';
UPDATE categories SET counter=counter+1 WHERE id = NEW.category_id;
EXECUTE 'NOTIFY category'||NEW.category_id::text||'_changed';
END IF;
END IF;
IF (TG_OP = 'INSERT') THEN
UPDATE categories SET counter=counter+1 WHERE id = NEW.category_id;
EXECUTE 'NOTIFY category'||NEW.category_id::text||'_changed';
END IF;
RETURN NEW;
END;
CREATE TRIGGER trg_upd_category
AFTER INSERT OR UPDATE OR DELETE
ON messages
FOR EACH ROW
EXECUTE PROCEDURE msgs_upd_counters();
Everything works just fine, until I execute FAILOVER or DROP NODE (may
be MOVE SET does it too, I don't know).
Sometimes after that the counters doesn't match the real messages count
for some of the categories, i.e. for example, table "categories" shows
that "counter" for category_id=15 is 2, but there is only one message in
table "messages" with category_id=15.
I suspect two options:
1. Either Slony doesn't recognize INSERT INTO messages, UPDATE
categories and NOTIFY as ONE SINGLE transaction
2. Or Slony allows my application to do INSERT/DELETEs while triggers
are not activated by Slony (after FAILOVER) yet.
Does anyone has any thoughts on this subject?
I'm not happy with the idea that I would have to remove this trigger and
add a bunch of SQL code to all the INSERT/DELETE/UPDATE operations in my
code.
Best regards, Nick.
- Previous message: [Slony1-general] [GENERAL] vacuum issues under load?
- Next message: [Slony1-general] can slony break a transaction with trigger?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-general mailing list