假设我在 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 步之后恢复,然后因为重新创建视图而失败?
谢谢。