超详细的PG事务隔离级别总结
|
SQL标准定义了四种隔离级别。最严格的是可序列化,在标准中用了一整段来定义它,其中说到一组可序列化事务的任意并发执行被保证效果和以某种顺序一个一个执行这些事务一样。其他三种级别使用并发事务之间交互产生的现象来定义,每一个级别中都要求必须不出现一种现象。注意由于可序列化的定义,在该级别上这些现象都不可能发生。 在各个级别上被禁止出现的现象是:
SQL标准和PostgreSQL实现的事务隔离级别如下:ostgreSQL中可以请求四种标准事务隔离级别中的任意一种。 但是在内部,只实现了三种不同的隔离级别,即:PostgreSQL的读未提交模式的行为类似于读已提交。 这是因为这是把标准的隔离级别映射到PostgreSQL的多版本并发控制架构的唯一合理方法。 要设置一个事务的事务隔离级别,使用SET TRANSACTION命令是PostgreSQL中的默认隔离级别。 当一个事务运行使用这个隔离级别时, 一个查询(没有FOR UPDATE/SHARE子句)只能看到查询开始之前已经被提交的数据, 而无法看到未提交的数据或在查询执行期间其它事务提交的数据。(假设SQL查询了10s,这10s中间插入的新数据是看不到的)实际上,SELECT查询看到的是一个在查询开始运行的瞬间该数据库的一个快照。不过SELECT可以看见在它自身事务中之前执行的更新的效果,即使它们还没有被提交。还要注意的是,即使在同一个事务里两个相邻的SELECT命令可能看到不同的数据, 因为其它事务可能会在第一个SELECT开始和第二个SELECT开始之间提交。 UPDATE、DELETE、SELECT FOR UPDATE和SELECT FOR SHARE命令在搜索目标行时的行为和SELECT一样: 它们将只找到在命令开始时已经被提交的行。 带有ON CONFLICT DO UPDATE子句的INSERT的行为类似。 在读已提交模式下,建议插入的每一行都将插入或更新。除非有无关的错误, 否则这两个结果中的一个是有保证的。如果冲突源于另一个其影响对于 INSERT不可见的事务,则将对该行使用UPDATE子句, 即使可能没有命令常规可见的该行的版本。 带有ON CONFLICT DO NOTHING子句的INSERT 可能由于其影响对INSERT快照不可见的另一事务的结果而不插入行。 同样,只有在读已提交模式下才是这种情况。
因为上面的规则,正在更新的命令可能会看到一个不一致的快照: 它们可以看到并发更新命令在它尝试更新的相同行上的作用, 但是却看不到那些命令对数据库里其它行的作用。 这样的行为令读已提交模式不适合用于涉及复杂搜索条件的命 (编辑:文章分享网_茂名站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


