postgres咨询锁性能

问题描述 投票:0回答:1

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)
  • 但如果不使用,高并发时无法保证事务的安全执行,会出现脏写。有什么办法可以使用吗?
  • 确保安全并行和高性能的解决方案?
postgresql postgresql-9.3
1个回答
0
投票

我注意到 PARALLEL SAFE STRICT,这对我有用吗?

© www.soinside.com 2019 - 2024. All rights reserved.