【发布时间】:2018-09-25 09:06:56
【问题描述】:
这里是来自postgresql 9.6 docs 关于读取提交隔离级别的完整段落:
Read Committed 是 PostgreSQL 中的默认隔离级别。当一个 事务使用这个隔离级别,一个 SELECT 查询(没有 FOR UPDATE/SHARE 子句)只看到查询开始前提交的数据; 它永远不会看到未提交的数据或期间提交的更改 通过并发事务执行查询。实际上,一个 SELECT 查询 在查询开始的那一刻看到数据库的快照 跑步。但是, SELECT 确实看到了以前执行的更新的效果 在它自己的事务中,即使它们尚未提交。 另请注意,两个连续的 SELECT 命令可以看到不同的数据, 即使它们在单个事务中,如果其他 事务在第一个 SELECT 开始之后和之前提交更改 第二个 SELECT 开始。
所以基本上:
SELECT 查询只能看到在查询开始之前提交的数据,并且永远不会看到在查询执行期间提交的更改 并发事务。
但在最后一句中它指出:
还要注意两个连续的 SELECT 命令可以看到不同的数据, 即使它们在单个事务中,如果其他 事务在第一个 SELECT 开始之后和之前提交更改 第二个 SELECT 开始。
对我来说,这看起来很矛盾。有人可以详细说明吗?两个 SELECT 查询究竟如何在一个事务中看到不同的数据?事务不是孤立的吗?
【问题讨论】:
标签: sql postgresql transactions