【问题标题】:Understanding transaction isolation during delete了解删除期间的事务隔离
【发布时间】:2021-09-07 21:05:56
【问题描述】:

假设我有一张表,用于存储鞋店的销售额。现在,假设在同一个数据库事务中,我删除了某个日期 (2021-09-08) 的所有销售额,然后重新填充了当天的销售额(因此在同一个事务中删除并插入)。如果在 2021 年 9 月 8 日选择销售的单独选择交易与删除/插入交易同时运行,那么该选择交易潜力是否会以 0 个结果返回。也就是select可以在delete之前,insert之前运行吗?

我知道删除不会在 postgres 中锁定整个表(至少,我认为这是正确的)。但也许事务以这样一种方式运行删除/插入,即表永远不会在单独的选择事务中看起来是空的?我真的不明白交易是如何运作的。是在一些临时内存中删除/插入,然后将其提交给实际的表数据(我认为这是不正确的)。

我们的应用程序经常在某些日期(删除/插入)中显示数据,我想知道在特定日期,对于运行选择的客户端来说,表格是否可以每个看起来都是空的。我认为答案是否定的……但我意识到我真的不知道这一点。我知道

【问题讨论】:

  • 而不是重复我将指向您的文档Transaction Isolation。短版是SELECT 会在DELETE/INSERT 事务开始之前看到表中的数据,假设默认隔离级别。

标签: postgresql transactions


【解决方案1】:

当一个事务正在进行时,其他事务看不到它的修改。因此,如果您在同一个事务中删除和插入数据,并发查询可以看到事务开始前的状态(旧数据)或提交后的状态(新数据)。修改事务本身之外的任何人都不会看到空表。

【讨论】:

    【解决方案2】:

    您所问问题的基础是ACID,特别是IsolationAtomicity。正如@adrian-klaver 所说,Postgres 有很好的文档说明它是Transaction Isolation

    但一般来说,事务中发生的事情在提交之前对其他用户完全不可见(Isolation),而在提交之后,所有其他用户将立即看到整个更改集( Atomicity)。要么全有,要么全无,数据库的其他用户不可能查看事务中正在发生的事情的中间状态(如果事务回滚,其他任何人几乎都不可能用户告诉)。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 2015-10-18
      • 2011-02-04
      • 1970-01-01
      • 2010-11-22
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多