Postgresql 中可序列化隔离如何工作

问题描述 投票:0回答:1

据我了解,这种模式应该顺序执行交易。 我编写了一个并行执行 2 个事务的示例,并预计其中一个事务会出现错误。但它没有发生。帮助我理解我错在哪里。

这里是使用 python 和 psycopg2 的示例

交易1.py:

cursor.execute("START TRANSACTION ISOLATION LEVEL SERIALIZABLE;")
cursor.execute("SELECT balance FROM customers WHERE name = '1'")
print(cursor.fetchall())

time.sleep(10)

cursor.execute("COMMIT")

交易2.py:

cursor.execute("START TRANSACTION ISOLATION LEVEL SERIALIZABLE;")
cursor.execute("UPDATE customers SET balance = balance + 100 WHERE name = '1'")
# I expected here error
cursor.execute("COMMIT")

我运行事务 1,然后运行事务 2,期望事务 2 返回错误,但事实并非如此

python postgresql transactions
1个回答
0
投票

隔离级别称为“可串行化”,而不是“可串行化”。这意味着交易不是序列化的。相反,您可以保证有一种方法可以串行执行相同的事务,以便它们最终得到相同的结果。

在您的情况下,您得到的结果与第一个事务在第二个事务开始之前完成的结果相同,尽管实际上它是稍后提交的。因此,存在等效的串行执行,并且不存在冲突。

© www.soinside.com 2019 - 2024. All rights reserved.