# HG changeset patch # User jbe # Date 1360546742 -3600 # Node ID 29ca4c6e2e78a775a55edfaa5e6b7c31908aae03 # Parent b9e625add823da5de26169e3195e11adf6bf6fd3 Removed locking system diff -r b9e625add823 -r 29ca4c6e2e78 core.sql --- a/core.sql Sun Feb 10 23:37:19 2013 +0100 +++ b/core.sql Mon Feb 11 02:39:02 2013 +0100 @@ -2849,138 +2849,6 @@ ------------------------------------------------- --- Locking for snapshots and voting procedure -- ------------------------------------------------- - - -CREATE FUNCTION "share_row_lock_issue_trigger"() - RETURNS TRIGGER - LANGUAGE 'plpgsql' VOLATILE AS $$ - BEGIN - IF TG_OP = 'UPDATE' OR TG_OP = 'DELETE' THEN - PERFORM NULL FROM "issue" WHERE "id" = OLD."issue_id" FOR SHARE; - END IF; - IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN - PERFORM NULL FROM "issue" WHERE "id" = NEW."issue_id" FOR SHARE; - RETURN NEW; - ELSE - RETURN OLD; - END IF; - END; - $$; - -COMMENT ON FUNCTION "share_row_lock_issue_trigger"() IS 'Implementation of triggers "share_row_lock_issue" on multiple tables'; - - -CREATE FUNCTION "share_row_lock_issue_via_initiative_trigger"() - RETURNS TRIGGER - LANGUAGE 'plpgsql' VOLATILE AS $$ - BEGIN - IF TG_OP = 'UPDATE' OR TG_OP = 'DELETE' THEN - PERFORM NULL FROM "issue" - JOIN "initiative" ON "issue"."id" = "initiative"."issue_id" - WHERE "initiative"."id" = OLD."initiative_id" - FOR SHARE OF "issue"; - END IF; - IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN - PERFORM NULL FROM "issue" - JOIN "initiative" ON "issue"."id" = "initiative"."issue_id" - WHERE "initiative"."id" = NEW."initiative_id" - FOR SHARE OF "issue"; - RETURN NEW; - ELSE - RETURN OLD; - END IF; - END; - $$; - -COMMENT ON FUNCTION "share_row_lock_issue_trigger"() IS 'Implementation of trigger "share_row_lock_issue_via_initiative" on table "opinion"'; - - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "initiative" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "interest" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "supporter" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -CREATE TRIGGER "share_row_lock_issue_via_initiative" - BEFORE INSERT OR UPDATE OR DELETE ON "opinion" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_via_initiative_trigger"(); - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "direct_voter" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "delegating_voter" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -CREATE TRIGGER "share_row_lock_issue" - BEFORE INSERT OR UPDATE OR DELETE ON "vote" - FOR EACH ROW EXECUTE PROCEDURE - "share_row_lock_issue_trigger"(); - -COMMENT ON TRIGGER "share_row_lock_issue" ON "initiative" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue" ON "interest" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue" ON "supporter" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue_via_initiative" ON "opinion" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue" ON "direct_voter" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue" ON "delegating_voter" IS 'See "lock_issue" function'; -COMMENT ON TRIGGER "share_row_lock_issue" ON "vote" IS 'See "lock_issue" function'; - - -CREATE FUNCTION "lock_issue" - ( "issue_id_p" "issue"."id"%TYPE ) - RETURNS VOID - LANGUAGE 'plpgsql' VOLATILE AS $$ - BEGIN - -- The following locking order is used: - -- 1st) row-level lock on the issue - -- 2nd) table-level locks in order of occurrence in the core.sql file - PERFORM NULL FROM "issue" WHERE "id" = "issue_id_p" FOR UPDATE; - -- NOTE: The row-level exclusive lock in combination with the - -- share_row_lock_issue(_via_initiative)_trigger functions (which - -- acquire a row-level share lock on the issue) ensure that no data - -- is changed, which could affect calculation of snapshots or - -- counting of votes. Table "delegation" must be table-level-locked, - -- as it also contains issue- and global-scope delegations. - PERFORM NULL FROM "member" WHERE "active" FOR SHARE; - -- NOTE: As we later cause implicit row-level share locks on many - -- active members, we lock them before locking any other table - -- to avoid deadlocks - LOCK TABLE "member" IN SHARE MODE; - LOCK TABLE "privilege" IN SHARE MODE; - LOCK TABLE "membership" IN SHARE MODE; - LOCK TABLE "policy" IN SHARE MODE; - LOCK TABLE "delegation" IN SHARE MODE; - LOCK TABLE "direct_population_snapshot" IN EXCLUSIVE MODE; - LOCK TABLE "delegating_population_snapshot" IN EXCLUSIVE MODE; - LOCK TABLE "direct_interest_snapshot" IN EXCLUSIVE MODE; - LOCK TABLE "delegating_interest_snapshot" IN EXCLUSIVE MODE; - LOCK TABLE "direct_supporter_snapshot" IN EXCLUSIVE MODE; - RETURN; - END; - $$; - -COMMENT ON FUNCTION "lock_issue" - ( "issue"."id"%TYPE ) - IS 'Locks the issue and all other data which is used for calculating snapshots or counting votes.'; - - - ------------------------------------------------------------------------ -- Regular tasks, except calculcation of snapshots and voting results -- ------------------------------------------------------------------------