我正在运行一个带有两个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
中的,但是没有运气。任何帮助,不胜感激。谢谢!