Django-具有多个同步数据库的表的排他锁

时间:2018-06-25 21:14:17

标签: django database postgresql django-rest-framework database-replication

我正在运行一个带有两个Postgres数据库(在本地docker容器中运行),一个只写数据库和一个只读副本的Django应用。我已经设置了副本数据库以将任何更新流式传输到主数据库。我的DBRouter看起来像:

def db_for_read(self, model, **hints):
    return 'read_replica'

def db_for_write(self, model, **hints):
    """
    Writes always go to primary.
    """
    return 'primary'

def allow_relation(self, obj1, obj2, **hints):
    """
    Relations between objects are allowed on either.
    """
    return True

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Migration to be done on both.
    """
    return True

我的问题是我有一个API视图,出于并发原因,该视图在数据库表之一上放置了“ EXCLUSIVE LOCK”。视图从表中读取一些当前值,然后基于某种逻辑创建一个新的行/模型实例。但是,通过这种只读副本设置,我无法调用该端点,因为它似乎陷入了死锁-视图从不返回响应。我正在使用django rest框架的视图集并将视图包装在原子事务中。视图看起来像

class MyViewSet(viewsets.ModelViewSet):
    @transaction.atomic
    @decorator that executes exclusive lock on my_table
    def my_view(self, serializer):
       # some logic related to my_table
       serializer.save(...) 

有人知道我需要做什么,以便该视图可以执行并且不会死锁吗?我已经尝试绕过read_replica直接做类似

if model._meta.label == my_table_name:
    return 'primary'
db_router中db_for_read中的

,但是没有运气。任何帮助,不胜感激。谢谢!

0 个答案:

没有答案