我想尝试使用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;
但我无法找到新记录。怎么了?
答案 0 :(得分:14)
PostgreSQL不支持脏读(READ UNCOMMITTED
)。正如@a_horse_with_no_name指出的那样,the manual说:
SQL标准定义了一个额外的级别
READ UNCOMMITTED
。在PostgreSQL中,READ UNCOMMITTED
被视为READ COMMITTED
。
这符合标准中的规则,即数据库必须将不支持的隔离级别视为最强的支持级别。
没有支持的方法从PostgreSQL中的正在进行的事务中读取未提交的元组。如果你有能够获得主键和一般混乱的重复值之类的东西,那么无论如何它都不会非常有用。
有 正在进行的事务可以通信并相互影响的几种方式:
SEQUENCE
(和SERIAL
)更新立即发生,而不是在提交时发生READ COMMITTED
可见性UNIQUE
和EXCLUSION
约束可以使用仅限超级用户的调试工具(如pageinspect)查看未提交的元组数据,但前提是您真正了解数据存储区的内部结构。它仅适用于数据恢复和调试。您将在十六进制输出的墙上看到多个版本的数据。
答案 1 :(得分:0)
Lospejos,如果您开始事务并执行插入操作,您可以运行 SELECT 来查看行,因为您在事务中,其他人看不到这一行。但是如果你发出另一个 BEGIN 它是另一个事务,所以不要这样做,只需执行 (BEGIN, INSERT, SELECT, COMMIT)。如果您选择您的行并注意到它是错误的,请执行 ROLLBACK 以丢弃该行。 Postgress 不接受 UNCOMMITED READ 的事实很遗憾。例如,我在 DB2 和 Teradata 中使用它。特别是如果您想在不等待 COMMIT 的情况下查看其他事务在表中执行的操作。