据我了解,这种模式应该顺序执行交易。 我编写了一个并行执行 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 返回错误,但事实并非如此
隔离级别称为“可串行化”,而不是“可串行化”。这意味着交易不是序列化的。相反,您可以保证有一种方法可以串行执行相同的事务,以便它们最终得到相同的结果。
在您的情况下,您得到的结果与第一个事务在第二个事务开始之前完成的结果相同,尽管实际上它是稍后提交的。因此,存在等效的串行执行,并且不存在冲突。