【发布时间】:2017-03-22 13:55:42
【问题描述】:
我有一张桌子需要在不中断服务的情况下清除。大约 99.99% 的数据应该被删除,所以我正在尝试重新创建表并将 0.01% 的有用数据移动到新表中,如下所示(稍后我将截断旧表):
BEGIN ISOLATION LEVEL SERIALIZABLE;
LOCK TABLE table1 IN ACCESS EXCLUSIVE MODE;
/* I rename the old table */
ALTER TABLE table1 RENAME TO table1_to_be_deleted;
/* And I recreate the table */
CREATE TABLE table1 (
...
);
/* Restore usefull data from old table to new one */
INSERT INTO table1 SELECT * FROM table1_to_be_deleted WHERE toBeKept = 1;
COMMIT;
但是当我运行我的事务时,由于未在新表中找到但存在于旧表中的行,我遇到了一些客户端错误。这些行被很好地标记为要保留,因此它们应该从旧表复制到事务内部的新表中,并由客户的请求找到......
当其他请求正在等待获取表上的锁时,它是否获得了指向目标对象的指针?这是我提交事务后唯一可以解释旧表更新的解释...
PS:我使用的是 Postgres 9.1
【问题讨论】:
-
那些行是在你提交之后插入的?..
标签: sql postgresql transactions locking