PostgreSQL事务隔离READ UNCOMMITTED

时间:2015-11-11 07:33:02

标签: postgresql

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

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

//UNCOMMITTED

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

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

但我无法找到新记录。怎么了?

2 个答案:

答案 0 :(得分:14)

PostgreSQL不支持脏读(READ UNCOMMITTED)。正如@a_horse_with_no_name指出的那样,the manual说:

  

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

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

没有支持的方法从PostgreSQL中的正在进行的事务中读取未提交的元组。如果你有能够获得主键和一般混乱的重复值之类的东西,那么无论如何它都不会非常有用。

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

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

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

答案 1 :(得分:0)

Lospejos,如果您开始事务并执行插入操作,您可以运行 SELECT 来查看行,因为您在事务中,其他人看不到这一行。但是如果你发出另一个 BEGIN 它是另一个事务,所以不要这样做,只需执行 (BEGIN, INSERT, SELECT, COMMIT)。如果您选择您的行并注意到它是错误的,请执行 ROLLBACK 以丢弃该行。 Postgress 不接受 UNCOMMITED READ 的事实很遗憾。例如,我在 DB2 和 Teradata 中使用它。特别是如果您想在不等待 COMMIT 的情况下查看其他事务在表中执行的操作。