dex*_*ers 8 sql postgresql transaction-isolation
考虑在PostgreSQL 9.1(或9.2)中执行的以下查询:
SELECT * FROM foo WHERE bar = true
Run Code Online (Sandbox Code Playgroud)
假设它是一个相当长时间运行的查询(例如,花一分钟).
如果在查询开始时有500万条记录bar = true保留,并且在另一个事务中的此查询期间,foo表中添加和删除了行,并且对于某些现有行,将对该bar字段进行更新.
这会影响上面显示的选择查询的结果吗?
我知道单个事务中单独语句之间的事务隔离和可见性,但是正在运行的单个语句呢?
Erw*_*ter 10
不会.由于MVCC模型,只有在查询开始时可见的元组才会在单个中使用SELECT.手册中详细信息在这里:
Read Committed是PostgreSQL中的默认隔离级别.当事务使用此隔离级别时,SELECT查询(没有FOR UPDATE/SHARE子句)仅查看在查询开始之前提交的数据; 它永远不会看到未提交的数据或在并发事务的查询执行期间提交的更改.实际上,SELECT查询会在查询开始运行的瞬间看到数据库的快照.但是,SELECT确实看到了在其自己的事务中执行的先前更新的效果,即使它们尚未提交.另请注意,如果其他事务在执行第一个SELECT期间提交更改,则两个连续的SELECT命令可以看到不同的数据,即使它们在单个事务中.
强调我的.
查询将是查询开始时数据的读一致视图.在Postgresql中,有关多版本并发控制(MVCC)的文档解释了它是如何完成的(表中存在多个版本的记录).在Oracle中,序列变更编号(SCN)与修改数据的"前映像"一起使用.这是一个旧文档,Postgresql中的事务处理, "非覆盖存储管理"一节.但看看MVCC.
或者阅读Postgresql文档中有关MVCC的章节
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |