Postgresql:事务 - 异常程序问题
Posted
技术标签:
【中文标题】Postgresql:事务 - 异常程序问题【英文标题】:Postgresql: transaction - exception procedure problem 【发布时间】:2021-05-28 21:11:42 【问题描述】:我正在尝试使用过程控制事务,但遇到无法解决的错误。
这是代码:
drop table if exists cuentas;
create table cuentas (
id serial,
nombre varchar(100) not null,
saldo dec(15,2) not null,
primary key(id),
constraint saldo CHECK(saldo > 5000)
);
insert into cuentas(nombre, saldo)
values('Carlos',10000);
insert into cuentas(nombre, saldo)
values('Cesar',10000);
SELECT * FROM cuentas;
drop procedure if exists transferir;
create or replace procedure transferir(id_emisor int,id_receptor int,cantidad dec)
language plpgsql
as $$
begin
-- adding the amount from the recievers's account
update cuentas
set saldo = saldo + cantidad
where id = id_receptor;
-- substracting the amount to the sender's account
update cuentas
set saldo = saldo - cantidad
where id = id_emisor;
commit;
EXCEPTION
WHEN check_violation THEN
RAISE NOTICE 'Violación de saldo.';
rollback;
commit;
end;$$
当我尝试执行时:
call transferir(1,2,1000);
我明白了:
ERROR: no se puede comprometer mientras hay una subtransacción activa
CONTEXT: función PL/pgSQL transferir(integer,integer,numeric) en la línea 13 en COMMIT
Estado SQL: 2D000
Error:
谁能看出我做错了什么?
【问题讨论】:
您的 Posgres 版本是什么? (select version();
会告诉你)。你在调用过程之前打开了自动提交吗?
【参考方案1】:
您好“a_horse_with_no_name”和论坛管理员, 很抱歉使用这个部分,我知道这不是正确的地方,但我不能回答 a_horse_with_no_name 也不能评论他的建议。 我正在使用 Postgresql 12.4 版。 我也取消选择自动提交。 但是 Postgresql 抛出错误。 谢谢
【讨论】:
嗯,你可以尝试只使用一个帐户。如果您使用的是您开始提问时使用的帐户,则可以简单地对其进行编辑并添加您被要求提供的信息...以上是关于Postgresql:事务 - 异常程序问题的主要内容,如果未能解决你的问题,请参考以下文章
发生异常后,如何使用 PostgreSQL 在 Spring Boot 中继续事务?
使用 wt c++ 库连接到 postgresql 数据库时出现异常?
不能在 Entity Framework 6.1.3 和 PostgreSQL 中使用打开的事务