PostgreSQL事务隔离READ UNCOMITTED



我想尝试使用带有pgadmin的PostgreSQL进行事务隔离。首先,我在BEGIN中插入了一条新记录,但没有COMMIT。

BEGIN;
INSERT INTO my_table(id,value) VALUES (1,'something');
//UNCOMMITTED

然后,我尝试读取未提交的数据

BEGIN TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM my_table
COMMIT;

但我找不到新唱片。怎么了?

PostgreSQL不支持脏读(READ UNCOMMITTED)。正如@a_hors_with_no_name所指出的,手册上写着:

SQL标准定义了一个附加级别READ UNCOMMITTED。在PostgreSQL中,READ UNCOMMITTED被视为READ COMMITTED

这符合标准中的规则,即数据库必须将不受支持的隔离级别视为最强的受支持级别。

在PostgreSQL中,没有支持从正在进行的事务中读取未提交元组的方法。如果有的话,你可以得到主键的重复值和一般的混乱,所以它无论如何都不会很有用。

几种正在进行的事务可以相互通信和影响的方式:

  • 通过共享客户端应用程序(当然)
  • SEQUENCE(和SERIAL)更新立即发生,而不是在提交时
  • 咨询锁定
  • 正常的行和表锁定,但在READ COMMITTED可见性规则范围内
  • UNIQUEEXCLUSION约束

使用pageinspect等仅限超级用户的调试工具可以查看未提交的元组数据,但前提是您真正了解数据存储的内部结构。它仅适用于数据恢复和调试。您将在十六进制输出的墙上看到多个版本的数据

Lospejos,如果您开始一个事务并进行插入,您可以运行SELECT来查看行,因为您在事务中,其他人看不到此行。但是,如果您发出另一个BEGIN,它就是另一个事务,所以不要这样做,只需执行(BEGIN、INSERT、SELECT、COMMIT)即可。如果您选择了您的行并注意到它是错误的,请执行ROLLBACK以放弃该行。事实上,研究生不接受非委托阅读是一个遗憾。例如,我在DB2和Teradata中使用了这一点。特别是如果您想在不等待COMMIT的情况下查看表中的其他事务在做什么。

最新更新