If you are using MySQL, be sure to use the READ COMMITTED isolation level rather than REPEATABLE READ (the default), otherwise you may see cases where get_or_create will raise an IntegrityError but the object won’t appear in a subsequent get() call.
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com。
要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com。
要查看更多选项,请访问https://groups.google.com/d/optout。
感觉@LeoJay这么一解释,我就懂了。文档中这句话针对的应该是这种情况:
from django.db import transaction
with transaction.atomic():
User.objects.get_or_create(nickname='xxx')如果将 get_or_create语句包裹在一个事务中,且MySQL的隔离级别设置成可重复读的话,上述语句确实会抛出IntergrityError的异常。
我看了一下get_or_create的实现,它的执行过程应该是这样的:

由于get_or_create实际上执行了三个事务,如果我们没有手动地把它放在一个事务中的话,它应该是不会抛出IntegrityError异常的。如果我们手动地把它放在一个事务中的话,而数据库的隔离级别又是可重复读的话,那么就很容易出现 @LeoJay 所说的情况,数据取又取不出来,存又存不进去。
以上就是我们对于get_or_create的理解,由于我水平有限,不对的地方还请大家指正。
IntegrityError异常的”