我是Postgresql的新手,所以我不想为一些基本任务创建自己的结构....
我的任务是创建函数并在某些条件下抛出异常(RAISE EXCEPTION 'test'
)以便客户端捕获它或在不正确处理它的情况下重新抛出。问题是在抛出之前我想将异常LOG记录到数据库中的特殊表中,但是意识到抛出错误正在回滚之前所做的更改!有没有办法改变这种行为或我能做的所有 - 添加一些CODE输出参数并根据该CODE在客户端上抛出错误?我现在使用的示例代码:
CREATE OR REPLACE FUNCTION fn_...()
...
BEGIN
IF nretry_count >= nmax_retry
THEN
INSERT INTO log VALUES (error_type, value) VALUES (1,'Max retry exceeded!');
RAISE EXCEPTION 'Max retry count exceeded';
END IF;
END
$$ LANGUAGE plpgsql;
答案 0 :(得分:3)
您可以启动交易并在应用程序中设置SAVEPOINT
。然后,在您捕获异常后,ROLLBACK TO SAVEPOINT
,创建日志条目并@Service
public class UserService {
public void addUser(User user) {
if (!userRepository.exists(user.getId())) {
userRepository.save(user);
}
}
public void updateUser(int id, User user) {
if (userRepository.exists(user.getId())) {
userRepository.save(user);
}
}
}
。
无法从函数中抛出异常并且执行未回滚的数据修改,因为PostgreSQL中没有“自治事务”。