当前位置: 首页 > 知识库问答 >
问题:

读提交隔离级别中的确切命令定义是什么?

宰父志新
2023-03-14

假设我们使用自动提交模式,即:。

默认情况下(没有BEGIN),PostgreSQL以“自动提交”模式执行事务,即每个语句都在自己的事务中执行,并在语句末尾隐式执行提交(如果执行成功,否则回滚完成)。

然后,使用读取提交的隔离级别(在 postgresql 中也是缺省值),该语句是实际的隔离单元。但在这里,这句话只意味着外在的陈述?同一外部语句中嵌入的语句呢?

  • CTE(带查询)

我测试了一些情况,似乎主查询和所有WITH查询共享相同的事务快照,尽管由于依赖性,一些查询可能会在另一个查询之后发生。

with a as
(
statements...
),
b as (
statements depends on a, e.g. from a,
)
main query

如果在整个查询运行期间,提交了新事务,此处的任何(子)查询是否应该看到新数据?

  • 触发函数中的语句

很容易测试并知道触发器函数中的每个语句都满足读提交隔离级别规则,即每个语句在开始执行之前都会看到所有提交事务的数据。

outer dml statement ----trigger---> foobar()
                                        statement1
                                        statement2
                                        ....

如果在语句1之后提交了其他事务,语句2将会看到新数据。

    [Li]子查询

考虑 WHERE 部分中的子查询,很难测试每次执行子查询是否会看到来自其他已提交事务的新数据,因为子查询将主要由优化程序转换为连接。

select * from foo where col1 > any(select col1 from bar where ....);

如果在第二次运行子查询(修改了表栏)后提交了其他事务,那么第三次运行子查询会看到新数据吗?

我还没有根据这个主题阅读postgresql的源代码,有人知道答案吗?

共有1个答案

商天逸
2023-03-14

我在pgsql一般邮件列表中提出问题:

http://www . PostgreSQL . org/message-id/flat/CAAC 9 roz 1 tmme 7 ntb 3 nkvhipjx 0 ckmc 5 umfhadpdmxkmxagco 7 w @ mail . Gmail . com # CAAC 9 roz 1 tmme 7 ntb 3 nkvhipjx 0 ckmc 5 umfhadpdmxkmxagco 7 w @ mail . Gmail . com

我现在找到了答案:

对于所有情况(触发器、CTE、其他子查询),只要它们使用用PL编写的标记为VOLATILE(默认情况下)的函数,则函数中包含的每个查询都可以看到新数据。

http://www.postgresql.org/docs/current/static/xfunc-volatility.html

稳定的和不可变的函数使用在调用查询开始时建立的快照,而可变的函数在它们执行的每个查询开始时获得新的快照。

 类似资料:
  • 本文向大家介绍Mysql事务隔离级别之读提交详解,包括了Mysql事务隔离级别之读提交详解的使用技巧和注意事项,需要的朋友参考一下 查看mysql 事务隔离级别 可以看到当前的事务隔离级别为 READ-COMMITTED 读提交 下面看看当前隔离级别下的事务隔离详情,开启两个查询终端A、B。 下面有一个order表,初始数据如下 第一步,在A,B中都开启事务 第二步查询两个终端中的number值

  • 我有一个查询如下在PostgreSQL: 许多工作人员试图一次处理一项工作(这就是为什么我有限制为1的子查询)。在此更新之后,每个工作人员都会获取有关id的信息并处理工作,但有时他们会获取相同的工作并处理两次或更多次。隔离级别已读提交。 我的问题是,我如何保证一个工作将被处理一次?我知道有这么多的帖子,但我可以说我已经尝试了其中的大部分,但都没有帮助(); 我已尝试选择更新,但它导致了死锁的情况

  • 在我的airflow升级到2.0.0(然后是2.0.1)并且调度程序扩展到3个节点之后,奇怪的事情发生了: DAGRUNN成功,但根本没有计划任务实例 任务失败,主机名为空(https://github.com/apache/airflow/issues/13692) 任务设置为“upstream_failed”,而上游任务成功(https://github.com/apache/airflow/

  • 基于中的评论https://www.jooq.org/doc/3.6/manual/sql-execution/transaction-management/对于Jooq来说,改变隔离级别似乎还不太可能。然而,不清楚Jooq设置的隔离级别是什么,因此我的问题是:Jooq使用的隔离级别是什么? 特别是,看起来我正在经历脏读,而我需要事务来防止这种情况。有人能确认Jooq事务阻止了脏读吗? 注意:将J

  • 问题内容: 也许有人可以帮助我解决Spring(3.1)/ Postgresql(8.4.11)中的事务性问题 我的交易服务如下: Spring配置Webapp包含: 让我们说一个请求“ x”和一个请求“ y”同时执行并到达注释“比较”(方法insertObject)。然后,允许他们两个都插入一个新对象,并提交他们的事务。 为什么我没有RollbackException?据我所知,这就是可序列化等

  • 问题内容: 我有一个使用hibernate3.6.4版和c3p0 0.9.1.2版进行连接池的应用程序。我的基础RDBMS是MySql 5.0.67版。 我的MySql安装表明默认的事务隔离级别为“ REPEATABLE-READ”(4): 我尚未在hibernate.cfg.xml或应用程序中的任何位置更改或配置事务隔离级别。在应用程序中,我使用以下代码来打印配置: 我得到以下结果: 因此,我的