我在Django unittest中看到一个奇怪的错误,在极少数情况下,尝试保存模型实例会引发异常:
OperationalError: cannot start a transaction within a transaction
导致这种情况的原因是什么?
真正奇怪的是,这发生在如下的循环中:
for i in range(10):
obj = MyModel(name='blah %i' % i)
obj.save()
并且在抛出异常之前会经历几次迭代。
由于它是非确定性的,因此诊断起来非常令人沮丧,而且我不清楚发生了什么。由于我使用Django的标准TransactionTestCase,我认为这个错误是不可能的,因为TestCase将每个测试包装在atomic()
上下文管理器中以包装事务中的所有更改。不应该试图创建另一个交易。
我能想到的另一件事可能会影响到这一点,我的模型有一个post_save信号处理程序,可能是某人在交易之外打破或者干扰,但我不确定如何测试它,因为我无法可靠地重现错误。