【问题标题】:Does Postgresql implicitly wrap select statements in transaction?Postgresql 是否在事务中隐式包装 select 语句?
【发布时间】:2021-05-04 03:57:57
【问题描述】:

PostgreSQL 实际上将每个 SQL 语句视为在事务中执行。如果您不发出 BEGIN 命令,则每个单独的语句都有一个隐式的 BEGIN 和(如果成功)COMMIT 包裹它。

来自Tutorial transactions

这是否意味着即使 select 语句也会被隐式包装在事务中,并且无法在事务范围之外使用 postgres?

【问题讨论】:

  • "没有办法在事务范围之外使用 postgres" - 是的(对于每个关系数据库来说基本上都是如此)

标签: postgresql


【解决方案1】:

这是否意味着即使 select 语句也会被隐式包装在事务中,并且无法在事务范围之外使用 postgres?

是的。

事务不仅与写入有关,还与隔离级别和 SELECT 可以读取的内容有关。例如,在通常的隔离级别,SELECT 不能读取未提交的写入。它也无法读取在 SELECT 运行时提交的事务完成的更新。否则它不会有一个连贯的数据库视图,基本上一切都会中断。例如它会在索引中查找,然后去获取对应的行,并且该行可能已经改变并且不再对应于索引。

这需要一种在 SELECT 开始执行之前获取数据库“快照”的方法,这是事务机制的一个重要功能。

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2017-05-06
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多