PostgreSQL 9.4 和 12.1,在 SQL 错误后丢失锁

问题描述

我们在支持临时查询的应用程序中使用 Postgresql

让我们以 Postgresql 为例:

应用程序使用名为“ENT001”的表,并定义了谨慎锁定,这意味着当用户开始修改记录时,该记录将立即被锁定,这样第二个用户将无法修改相同的记录直到锁被释放。

记录被修改(被锁定)后,在同一个应用会话中,执行如下sql语句: “从 AAAm ent001 中选择计数 ( * )”

注意错误拼写的关键字 fromAAAm,这是一个语法错误

对于当前的 Postgresql,执行上述 sql 语句后,修改记录的锁由 Postgresql 服务器释放,因此第二个应用程序会话能够修改相同的记录,这不是我们所期望的。此问题仅在 Postgresql 中出现,在 Oracle 或 MS sql Server 中不出现。

我们看到的是,Postgresql 在出现 sql 错误时中止事务,导致事务中关联的所有锁都被释放。

所描述的 Postgresql 问题是错误还是有意为之?

我们使用以下 api 调用来处理 sql

result = sqlExecDirectW(sqlStatement,statementText,sql_NTS);

并将其替换为

result = sqlPrepareW(sqlStatement,sql_NTS);
...
result = sqlExecute(sqlStatement);

这似乎有效,但是在短时间内在多个事务中的行为有些不同。 sqlPrepareW 有时会返回:“准备好的语句已经存在”或告诉我们 Postgresql 仍然忙碌的错误。抱歉上次的错误,我还没有详细信息。

所描述的 Postgresql 问题是错误还是有意为之?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)