如何在事务提交时触发错误?

Max*_*kov 0 postgresql transaction

我开发了一个在 Postgresql 中实现事务的库,在我的工作中,我们在生产中遇到了一个奇怪的错误,当事务失败不是查询本身,而是COMMIT由于触发器中的某些内容失败。显然,我的图书馆没有以正确的方式处理这种情况。

显然,我想在我的库测试套装中复制这个错误,但我不想引入所有复杂的设置。我需要的所有行为是,Postgresql 必须不向事务内的任何查询返回错误,而是在您尝试时返回错误COMMIT。实现它的最小和稳定的方法是什么?

Dan*_*ité 5

一种方法是使用延迟约束。

CREATE TABLE tst(x int CONSTRAINT test_me UNIQUE DEFERRABLE INITIALLY DEFERRED);

begin;

insert into tst values(1);

insert into tst values(1);  -- Note: no error at this point

commit;
Run Code Online (Sandbox Code Playgroud)

COMMIT 失败:

ERROR:  duplicate key value violates unique constraint "test_me"
DÉTAIL : Key (x)=(1) already exists.
Run Code Online (Sandbox Code Playgroud)