Python sqlite3模块未回滚事务

0 投票
1 回答
575 浏览
提问于 2025-04-16 12:07

考虑一下这个测试案例:

import sqlite3

con1 = sqlite3.connect('test.sqlite')
con1.isolation_level = None
con2 = sqlite3.connect('test.sqlite')
con2.isolation_level = None
cur1 = con1.cursor()
cur2 = con2.cursor()
cur1.execute('CREATE TABLE foo (bar INTEGER, baz STRING)')
con1.isolation_level = 'IMMEDIATE'
cur1.execute('INSERT INTO foo VALUES (1, "a")')
cur1.execute('INSERT INTO foo VALUES (2, "b")')
print cur2.execute('SELECT * FROM foo').fetchall()
con1.commit()
print cur2.execute('SELECT * FROM foo').fetchall()
con1.rollback()
print cur2.execute('SELECT * FROM foo').fetchall()

根据我的理解,我原本期待看到这样的结果:

[]
[(1, u'a'), (2, u'b')]
[]

但是这里的结果却是这样的:

[]
[(1, u'a'), (2, u'b')]
[(1, u'a'), (2, u'b')]

所以在第一个连接中调用 rollback() 方法并没有撤销之前提交的更改。为什么呢?难道不应该撤销吗?

提前谢谢你。

1 个回答

3

你不能在同一个操作中同时提交和回滚。调用 con1.commit() 会结束你在这个操作上的事务。接下来的 con1.rollback() 要么是被悄悄忽略了,要么是在回滚一个空的事务。

撰写回答