在我的Django应用程序中,我经常需要做一些类似于get_or_create()
的事情.例如,
用户提交一个标签.需要看看
但是看了文档get_or_create()
年后,它看起来不是线程安全的.线程A判断并发现记录X不存在.然后线程B判断并发现记录X不存在.现在线程A和线程B都将创建一个新的记录X.
这一定是一种非常普遍的情况.如何以线程安全的方式处理它?
在我的Django应用程序中,我经常需要做一些类似于get_or_create()
的事情.例如,
用户提交一个标签.需要看看
但是看了文档get_or_create()
年后,它看起来不是线程安全的.线程A判断并发现记录X不存在.然后线程B判断并发现记录X不存在.现在线程A和线程B都将创建一个新的记录X.
这一定是一种非常普遍的情况.如何以线程安全的方式处理它?
这一定是一种非常普遍的情况.如何以线程安全的方式处理它?
对
SQL中的"标准"解决方案是简单地try 创建记录.如果它起作用了,那很好.继续往前走.
如果try 创建记录时从RDBMS获得"重复"异常,则执行SELECT并继续操作.
但是,Django有一个ORM层,它有自己的缓存.因此,逻辑被颠倒,使常见的情况直接快速地工作,而不常见的情况(重复的)引发罕见的异常.