Vad*_*hin 4 postgresql transaction isolation-level
来自文档的引用:
Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只会看到在查询开始之前提交的数据;它永远不会看到未提交的数据或并发事务在查询执行期间提交的更改。实际上,SELECT 查询会在查询开始运行的那一刻看到数据库的快照。但是,SELECT 确实会看到在其自己的事务中执行的先前更新的影响,即使它们尚未提交。另请注意,如果其他事务在第一个 SELECT 执行期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据,即使它们位于单个事务中。
那么 PostgreSQL 是否看到另一个事务提交的更改?
区别在于查询和事务。一个事务可以包含任意数量的查询。为了说明差异,我设置了一个小例子:
CREATE TABLE table_to_be_updated (
id serial PRIMARY KEY,
other_column text,
column_changing text
);
INSERT INTO table_to_be_updated (other_column, column_changing)
VALUES
('value', 'old_value'),
('value', 'other_value'),
('nonvalue', 'doesnt matter');
Run Code Online (Sandbox Code Playgroud)
然后并发运行两个事务(一一发出命令,中间一行要描绘时间线):
| <-- BEGIN;
|
|
| UPDATE table_to_be_updated
BEGIN; -----------------------> | SET column_changing = 'new_value'
| WHERE
| other_column = 'value' AND
| column_changing = 'old_value';
|
|
SELECT column_changing -------> | -- update not yet committed
FROM table_to_be_updated |
WHERE other_column = 'value'; | <-- COMMIT;
|
|
SELECT column_changing -------> |
FROM table_to_be_updated |
WHERE other_column = 'value'; |
|
|
COMMIT; ----------------------> |
Run Code Online (Sandbox Code Playgroud)
在READ COMMITTED隔离级别运行这些,第一个查询返回一行“old_value”,而第二个查询显示一行“new_value”。在另一次运行中,我更改了左侧事务隔离级别:
SET transaction ISOLATION LEVEL REPEATABLE READ;
Run Code Online (Sandbox Code Playgroud)
(命令必须是事务中的第一条语句。)现在两个 SELECT 返回相同的行集,而提交两个事务后的第三个将显示新行。