只要任何SQL语句因错误而终止,Postgres就会自动中止事务,其中包括任何约束违规.例如:
glyph=# create table foo (bar integer, constraint blug check(bar > 5));
CREATE TABLE
glyph=# begin;
BEGIN
glyph=# insert into foo values (10);
INSERT 0 1
glyph=# insert into foo values (1);
ERROR: new row for relation "foo" violates check constraint "blug"
STATEMENT: insert into foo values (1);
ERROR: new row for relation "foo" violates check constraint "blug"
Run Code Online (Sandbox Code Playgroud)
尚未发出任何消息,但事务已回滚.我个人最喜欢的会议内容如下:
glyph=# commit;
ROLLBACK
Run Code Online (Sandbox Code Playgroud)
...因为" ROLLBACK
"似乎是一个奇怪的成功 -消息COMMIT
.但实际上,它已被回滚,表中没有行:
glyph=# select * from foo;
bar
-----
(0 rows)
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建大量的SAVEPOINT
s并以这种方式处理SQL中的错误,但是这涉及到数据库的更多流量,更多的延迟(我可能必须处理来自SAVEPOINT
之后的错误),但收益相对较小.我真的只想用我的应用程序语言处理错误(Python)try/except
,所以我想从SQL中获取的唯一行为是错误不会触发自动回滚.我能做什么?
小智 2
我对 PostgreSQL非常陌生,但 PostgreSQL 文档中有关触发器/服务器端编程的示例之一看起来完全符合您的要求。
请参阅:http ://www.postgresql.org/docs/9.2/static/trigger-example.html
页面片段:“因此触发器充当非空约束,但不会中止事务。 ”
归档时间: |
|
查看次数: |
4950 次 |
最近记录: |