【发布时间】:2013-01-08 01:42:31
【问题描述】:
假设我在 PostgreSQL 9.1 数据库中有这个 foo 表:
CREATE TABLE foo
(
bar integer,
flg_deleted boolean
);
连同这个 vwfoo 视图:
CREATE VIEW vwfoo AS
SELECT bar
FROM foo
WHERE flg_deleted = false;
还假设我有一个应用程序每秒运行几个短期事务,使用 vwfoo。
现在,我想向 foo 添加一列 baz 并且我希望 baz 在 vwfoo 中也。但是,当然,我不希望我的应用程序因为这些更改而出现任何错误。
如果我执行以下步骤(在单个事务中)以执行所需的更改:
- 放下vwfoo。
- 将列 baz 添加到 foo。
- 再次创建 vwfoo(现在包括 baz)。
我是否获得了所需的行为(应用程序中没有错误)?
在整个事务期间,vwfoo 上会不会有一个排他锁(这就是我想要的)?
是否有可能任何事务都会尝试在第 1 步和第 3 步之间使用视图然后失败(而不仅仅是阻塞,等待锁定)?
vwfoo 的“身份”在重新创建时会改变吗?换句话说:任何事务是否有可能在第 1 步和第 3 步之间尝试使用视图,阻塞,在第 3 步之后恢复,然后因为重新创建视图而失败?
谢谢。
【问题讨论】:
标签: database postgresql locking postgresql-9.1