CREATE TABLE IF NOT EXISTS account
(
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username TEXT NOT NULL,
coin NUMERIC NOT NULL DEFAULT 0 CHECK ( coin >= (0)::numeric ),
version BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE
);
CREATE TABLE IF NOT EXISTS transaction
(
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
account_id INTEGER NOT NULL REFERENCES account (id),
value NUMERIC NOT NULL,
balance NUMERIC NOT NULL DEFAULT 0 CHECK ( balance <> 'NaN'::numeric AND (balance >= (0)::numeric)),
type INTEGER NOT NULL CHECK ( type IN (1, 2, 4, 8, 16) ),
narration TEXT NOT NULL DEFAULT '',
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
deleted_at TIMESTAMP WITH TIME ZONE
);
-- TRIGGER
CREATE OR REPLACE FUNCTION transaction__sync_balance()
RETURNS TRIGGER AS
$$
BEGIN
-- UPDATE
UPDATE account
SET coin = coin + NEW.value,version = version + 1
WHERE id = NEW.account_id
RETURNING coin INTO NEW.balance;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER sync_balance_trigger
BEFORE INSERT
ON transaction
FOR EACH ROW
EXECUTE FUNCTION transaction__sync_balance();
SELECT pg_advisory_xact_lock(1001, account_id)
我注意到 PARALLEL SAFE STRICT,这对我有用吗?