Python sqlite3模块未回滚事务
考虑一下这个测试案例:
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() 要么是被悄悄忽略了,要么是在回滚一个空的事务。