2

http://www.postgresql.org/docs/9.1/static/transaction-iso.html 关于读取提交隔离级别的文档说

Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只能看到查询开始之前提交的数据;它永远不会看到未提交的数据或并发事务在查询执行期间提交的更改。实际上,SELECT 查询会在查询开始运行时看到数据库的快照。但是,SELECT 确实会看到在其自己的事务中执行的先前更新的影响,即使它们尚未提交。另请注意,如果其他事务在第一个 SELECT 执行期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据,即使它们在单个事务中也是如此。

最后一句话让我很困惑,这是什么意思?如果我在事务中没有 2 个选择,而是 3 个选择以及一些计算而不在它们之间使用 DML,该怎么办?每个选择都会在每个查询开始的那一刻看到它自己的快照?

4

1 回答 1

4

最后一句是指这种情况。

假设foo在两个事务开始之前有一个表包含一行:

交易 1 交易 2
-------------------------------------------------- -----
开始交易;
选择 *
来自 foo;
--> 返回 1 行
                         开始交易;
                         插入 foo 值 (2);
                         犯罪;
选择 *
来自 foo;
-->现在返回 2 行

(注意事务1在第一次select后还没有提交)

如果您不想在事务 1 中看到新的(已提交的)行,则需要使用称为“可重复读取”的隔离级别。该名称源于这样一个事实,即您可以一次又一次地重复相同的查询,并且您将反复看到相同的数据。

于 2014-05-03T07:51:44.590 回答