PostgreSQL - 如何在关机后解锁表记录

标签 postgresql

抱歉,我到处找这个,但找不到有效的解决方案:/ 我非常需要这个来进行异常测试。

我在这里要做的是:

  1. 在表 A 中插入行
  2. 锁定这条记录
  3. (在单独的终端)服务 postgresql-9.6 停止
  4. 请稍等
  5. (在单独的终端)服务 postgresql-9.6 启动
  6. “尝试”通过执行“COMMIT”解锁记录;在与 #2 相同的终端。

我是怎么做的 #2 是这样的:

BEGIN;
SELECT * FROM TABLE A WHERE X=Y FOR UPDATE;

问题是,一旦我执行了#6,就会出现此错误:

DB=# commit;
FATAL:  terminating connection due to administrator command
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

所以当我执行“COMMIT;”时同样,它只显示:

DB=# commit;
WARNING:  there is no transaction in progress
COMMIT

现在记录无法解锁

我已经尝试获取那个锁定对象的 PID,然后执行 pg_terminate(或取消),但它不起作用。

DB=# select pg_class.relname,pg_locks.* from pg_class,pg_locks where pg_class.relfilenode=pg_locks.relation;
DB=# select pg_terminate_backend(2450);
FATAL:  terminating connection due to administrator command
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
DB=# select pg_cancel_backend(3417);
ERROR:  canceling statement due to user request

请帮忙。有人有什么想法吗? :/ ..或者这甚至可能吗?

我的规范:

  • Postgresql-9.6
  • 红帽 Linux

最佳答案

这里存在一三个根本性的误解。锁定状态不是持久的。

当您锁定记录(或表)时,锁与获取锁的事务相关联。该事务是正在运行的 PostgreSQL session 的一部分,即您与服务器的连接。

锁在事务结束时释放。

交易结束:

  • 在显式COMMITROLLBACK 时;
  • 当 session 断开而未对打开的事务进行显式 COMMIT 时,触发隐式 ROLLBACK
  • 当服务器关闭时,终止所有事件 session ,再次触发所有正在进行的事务的隐含ROLLBACK

因此,当您在第 3 步关闭服务器时,您已经释放了在第 2 步获取的锁。获得该锁的事务不再存在,因为它的 session 因服务器关闭而终止。

如果检查 pg_locks,您将看到锁定的行如何在重启前存在并在重启后消失。

关于PostgreSQL - 如何在关机后解锁表记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47233465/

相关文章:

python - Django 管理员加载页面的速度非常慢

bash - 使用 PostgreSQL 和 bash 在单个事务中执行多个 .sql 文件

来自两列(或来自数组)的任何整数的postgresql唯一约束

postgresql - 为什么这个 PostgreSQL 事务给出 "WARNING: there is no transaction in progress"

postgresql - 用户 "postgres"的对等身份验证失败

arrays - 尝试查找任何 int 数组时出错

postgresql - 记录来自 Sequelize 的 postgres 输出消息

sql - 戈朗 : Multiple SQL query generate extra empty {{range. }}

sql - postgresql 中的慢 OR 语句

sql - Postgres中基于聚合函数查询表ID