celery任务和竞赛条件中的Django select_for_update,并且唯一

rbell01824

该应用程序具有以下相关模型:公司,节点和日志。

class VCompany(models.Model):
    company_name = models.CharField(max_length=50,  ...)

class VNode(models.Model):
            company = models.ForeignKey(VCompany, ...)
            name1 = models.CharField(...)
            name2 = models.CharField(...)

class Log(models.Model):
    node = models.ForeignKey(VNode, ... )

VNode必须是唯一的。不幸的是,没有简单的唯一/唯一在一起。如果name1是已知的,则company和name1的组合是唯一的。如果name2是已知的,则company和name2的组合是唯一的。name1或name2或两者都是已知的。

问题1:是否可以为上述情况构造一个唯一子句?如何?

芹菜任务用于通过处理文件中的某些数据来在日志中创建记录。有许多芹菜任务同时运行以创建日志记录。创建日志记录后,可能需要创建一个vnode。这将导致创建重复的vnode记录。为了解决这个问题,我正在这样做:

with transaction.atomic():
    # Get the company for update as a sync method.
    company = VCompany.objects.select_for_update().get(company_name=company)
    if name1:
        node, create = VNode.objects.get_or_create(company=company, name1=... )
        ... set other node data ...
        node.save()
        return node
    if name2:
        node, create = VNode.objects.get_or_create(company=company, name2=... )
        ... set other node data ...
        node.save()
        return node

此代码显然有效。但是,如果我删除带有transaction.atomic()的文件,它肯定会失败。

问题2:为什么需要transaction.atomic()?需要吗?

问题3:django的ORM何时发布select_for_update?是get_or_create导致它在创建新节点之前释放,从而导致出现竞争状况?

感谢您提供任何线索!

约书亚记

问题1:我不知道

问题2:

需要transaction_atomic,因为select_for_update仅在当前事务的持续时间内保持锁定。否则,(如果您未进行任何其他交易)它将立即释放锁。

问题3:

当前事务关闭(提交或回滚)时,将释放该锁。

get_or_create不是原子的,只有在数据库具有正确的唯一性约束时才是线程安全的。如果get_or_create违反唯一性约束,则将引发IntegrityError。

在您的情况下,锁定VCompany应该使VNode上的get_or_create方法无法失败。但是,只有在您正确锁定尝试创建VNode对象的所有位置时,这才是正确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么清除由Django中的select_for_update创建的锁?

来自分类Dev

并发进程中的Django select_for_update函数

来自分类Dev

当在同一条记录上使用两次Django的select_for_update死锁吗?

来自分类Dev

Django 1.5 select_for_update被认为是脆弱的设计

来自分类Dev

Django 1.3中的select_for_update类型的功能可避免出现竞争情况

来自分类Dev

Django 和 Celery 任务

来自分类Dev

select_for_update 在解除阻塞后是否看到另一个 select_for_update 事务添加的行?

来自分类Dev

任务:: ConfigureAwait-竞赛条件?

来自分类Dev

Vector中的竞赛条件

来自分类Dev

使用 Django、celery 和 Redis 安排任务

来自分类Dev

Oracle查询以查找记录,如果计数> = 2并且在列中是唯一的

来自分类Dev

Django,RabbitMQ和Celery-在更新开发中的Django代码后,为什么Celery运行旧版本的任务?

来自分类Dev

商店中的竞赛条件介于`render`和`componentDidMount`之间

来自分类Dev

Django / Python中的Celery任务最佳做法

来自分类Dev

没有Celery的Django中的预定任务?

来自分类Dev

Django中的Celery任务总是阻塞

来自分类Dev

Django / Python中的Celery任务最佳做法

来自分类Dev

REST服务和竞赛条件

来自分类Dev

从三个SELECT框中强制唯一选择

来自分类Dev

从数据库中选择一行中的值是唯一的并且限制为5个最新的行

来自分类Dev

从数据库中选择一行中的值是唯一的并且限制为5个最新值的行

来自分类Dev

Ruby on Rails中的竞赛条件

来自分类Dev

对具有特定列的文件进行排序和唯一化,并且仅保留给定文件中的第一个值

来自分类Dev

Django Celery任务记录

来自分类Dev

Google Cloud Console-此客户端ID在全球范围内是唯一的,并且已经在使用中

来自分类Dev

如果行不是唯一的,并且值已存储在其他列中,则 PostgreSQL 不存储

来自分类Dev

让任务竞赛

来自分类Dev

Django-celery和RabbitMQ不执行任务

来自分类Dev

在react-select中保留唯一值,该唯一值在选项数组中不存在

Related 相关文章

  1. 1

    什么清除由Django中的select_for_update创建的锁?

  2. 2

    并发进程中的Django select_for_update函数

  3. 3

    当在同一条记录上使用两次Django的select_for_update死锁吗?

  4. 4

    Django 1.5 select_for_update被认为是脆弱的设计

  5. 5

    Django 1.3中的select_for_update类型的功能可避免出现竞争情况

  6. 6

    Django 和 Celery 任务

  7. 7

    select_for_update 在解除阻塞后是否看到另一个 select_for_update 事务添加的行?

  8. 8

    任务:: ConfigureAwait-竞赛条件?

  9. 9

    Vector中的竞赛条件

  10. 10

    使用 Django、celery 和 Redis 安排任务

  11. 11

    Oracle查询以查找记录,如果计数> = 2并且在列中是唯一的

  12. 12

    Django,RabbitMQ和Celery-在更新开发中的Django代码后,为什么Celery运行旧版本的任务?

  13. 13

    商店中的竞赛条件介于`render`和`componentDidMount`之间

  14. 14

    Django / Python中的Celery任务最佳做法

  15. 15

    没有Celery的Django中的预定任务?

  16. 16

    Django中的Celery任务总是阻塞

  17. 17

    Django / Python中的Celery任务最佳做法

  18. 18

    REST服务和竞赛条件

  19. 19

    从三个SELECT框中强制唯一选择

  20. 20

    从数据库中选择一行中的值是唯一的并且限制为5个最新的行

  21. 21

    从数据库中选择一行中的值是唯一的并且限制为5个最新值的行

  22. 22

    Ruby on Rails中的竞赛条件

  23. 23

    对具有特定列的文件进行排序和唯一化,并且仅保留给定文件中的第一个值

  24. 24

    Django Celery任务记录

  25. 25

    Google Cloud Console-此客户端ID在全球范围内是唯一的,并且已经在使用中

  26. 26

    如果行不是唯一的,并且值已存储在其他列中,则 PostgreSQL 不存储

  27. 27

    让任务竞赛

  28. 28

    Django-celery和RabbitMQ不执行任务

  29. 29

    在react-select中保留唯一值,该唯一值在选项数组中不存在

热门标签

归档