Car*_*elo 5 postgresql transactions
有可能阻止Phantom读取,或以其他方式锁定Postgres事务中丢失的行吗?例如,请考虑以下命令序列:
在连接1上:
CREATE TABLE weather ( city varchar(80) PRIMARY KEY );
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO weather VALUES ('a');
Run Code Online (Sandbox Code Playgroud)
同时,在连接2上:
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM weather WHERE city = 'a' FOR SHARE;
INSERT INTO weather VALUES ('b');
Run Code Online (Sandbox Code Playgroud)
并回到连接1:
COMMIT;
Run Code Online (Sandbox Code Playgroud)
再次回到连接2:
COMMIT;
SELECT * FROM weather;
-- Shows both rows
Run Code Online (Sandbox Code Playgroud)
连接2上的事务似乎不可能成功,因为创建行'b'的前提条件取决于行'a'的缺失.如何防止第二个事务成功?
一种不锁定整个表的方法是使用 Postgresql 的Advisory lock[1] 机制:
-- tx 1
begin;
select pg_advisory_lock(1234);
insert/update....
commit;
-- tx 2
begin;
select pg_advisory_lock(1234);
SELECT * FROM weather WHERE city = 'a' FOR SHARE;
insert/update...
commit;
Run Code Online (Sandbox Code Playgroud)
这样您就能够进行事务间通信,而正常的 MVCC 行为是不够的。示例中1234是具有应用程序级别含义的任意整数。另请参阅 [2] 了解更多使用咨询锁的方法。
[1] http://www.postgresql.org/docs/9.5/static/explicit-locking.html#ADVISORY-LOCKS
[2] http://www.postgresql.org/docs/9.5/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS-TABLE
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |