Python 是否可以将事务嵌套在peewee+;sqlite?

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()

执行下面的代码会产生意外的结果。这是peewee、sqlite的问题还是我对事务的理解的问题

代码创建一个事务,然后调用函数3次,该函数在自己的事务中创建3条记录。该函数第1次和第3次成功,但第2次失败

我希望在数据库中找到6条记录,3条在第一次调用时创建,3条在第三次调用时创建,第二次调用期间创建的记录将回滚

相反,我只找到在第三次通话中创建的记录

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()