异常块中的事务 - 如何?

时间:2017-02-02 11:04:12

标签: postgresql

有些善意的灵魂可以指出这是错误的地方吗,拜托? 我正在尝试运行一个非常简单的事务测试,但是甚至无法运行该语句。我正在尝试在PG Admin的SQL Query窗口中运行它。没有与数据库的其他连接。

DO $$
BEGIN

START TRANSACTION;

UPDATE IsolationTests SET Col1 = 2;
perform pg_sleep(5.0);

ROLLBACK;

EXCEPTION WHEN division_by_zero THEN
BEGIN
END;

END $$;

我想玩事务级别并在代码中开始和结束事务。如果我评论出“START TRANSACTION”& “ROLLBACK”的声明运行良好。取消注释,我得到了

"ERROR:  cannot begin/end transactions in PL/pgSQL
HINT:  Use a BEGIN block with an EXCEPTION clause instead."

呃?它在BEGIN ... EXCEPTION块中,不是吗??

1 个答案:

答案 0 :(得分:0)

回答你的问题 - 指出这是声明的错误:START TRANSACTION;而不是BEGIN块中的EXCEPTION声明......

我不确定你要做什么。以下是回滚事务的示例(表t已创建,但未提交=>不存在),但异常(/ 0)已捕获并已处理(已提升信息):

t=# begin;
BEGIN
Time: 0.124 ms
t=#
t=# DO $$
t$# BEGIN
t$#   begin
t$#     create table t (i int);
t$#   end;
t$#     perform 1/0;
t$# EXCEPTION WHEN division_by_zero THEN
t$#   BEGIN
t$#     raise info '%','exc catched';
t$#   END;
t$#
t$# END;
t$# $$
t-# ;
INFO:  exc catched
DO
Time: 10.288 ms
t=#
t=# rollback;
ROLLBACK
Time: 0.152 ms
t=#
t=# \dt+ t
No matching relations found.
t=# ;
Time: 0.062 ms