我正在尝试使用psycopg实现事务。
这是我想要实现的SQL:
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM students WHERE matnr = 123457 FOR UPDATE;
UPDATE studierende
SET name = 'Name' WHERE matnr = 123457;
COMMIT;
但是当我连接
时 self.dbConnect = pg.connect(host=db_host,
database=db_database, user=db_user, password=db_password)
并设置隔离级别
self.dbConnect.set_isolation_level(3);
并使用.execute("SELECT...FOR UPDATE", data)
应锁定该行以供其他人选择。 但是虽然我设置了隔离级别,但我仍然可以执行甚至更新来自其他并行查询的行(它应该保持锁定直到第一个用户提交更改)。
在psql终端中,这是不可能的。但在这里。为什么呢?
答案 0 :(得分:0)
根据您的操作方式,它可能与Autocommit有关。使用autocommit,你发出一个SELECT FOR UPDATE并立即执行COMMIT并释放锁定,这样你就必须做BEGIN然后你的SELECT FOR UPDATE,然后在另一个会话中测试它时在COMMIT之前按住。