Python 是否可以将事务嵌套在peewee+;sqlite?
执行下面的代码会产生意外的结果。这是peewee、sqlite的问题还是我对事务的理解的问题 代码创建一个事务,然后调用函数3次,该函数在自己的事务中创建3条记录。该函数第1次和第3次成功,但第2次失败 我希望在数据库中找到6条记录,3条在第一次调用时创建,3条在第三次调用时创建,第二次调用期间创建的记录将回滚 相反,我只找到在第三次通话中创建的记录Python 是否可以将事务嵌套在peewee+;sqlite?,python,sqlite,transactions,peewee,Python,Sqlite,Transactions,Peewee,执行下面的代码会产生意外的结果。这是peewee、sqlite的问题还是我对事务的理解的问题 代码创建一个事务,然后调用函数3次,该函数在自己的事务中创建3条记录。该函数第1次和第3次成功,但第2次失败 我希望在数据库中找到6条记录,3条在第一次调用时创建,3条在第三次调用时创建,第二次调用期间创建的记录将回滚 相反,我只找到在第三次通话中创建的记录 import peewee class DbTest(peewee.Model): test = peewee.CharField()
import peewee
class DbTest(peewee.Model):
test = peewee.CharField()
class Meta:
database = db
def test(txt):
with db.transaction():
DbTest.create(test=txt + '1')
DbTest.create(test=txt + '2')
if txt == 'b':
raise
DbTest.create(test=txt + '3')
DbTest().drop_table(True)
DbTest().create_table(True)
with db.transaction():
for txt in ['a', 'b', 'c']:
try:
test(txt)
except:
pass
如果要嵌套事务,可以使用保存点
有没有办法知道我是否在交易中?也就是说,需要创建自己事务的函数(如问题中的
test()
)如何知道是使用db.savepoint()
(因为在调用函数之前已经创建了事务)还是db.transaction()
(因为还没有创建事务)?您可以调用db.transaction\u depth()
。谢谢。如果db.transaction\u depth()else db.transaction():的话,我尝试了使用db.savepoint()的,结果成功了。然后我尝试用savepoint
替换transaction
到我的原始代码中,它也能工作。看起来我无法打开事务,只能将与db.savepoint()一起使用块。这是否正确/安全?我不确定……我认为保存点只能在事务中创建。
with db.transaction():
with db.savepoint():
do_stuff()
with db.savepoint():
do_more_stuff()