簡體   English   中英

如何在 Django 中同時處理多個請求?

[英]How can I handle multiple requests at the same time in Django?

我目前正在編寫一個 API,用戶可以在其中將資金從他們的帳戶轉移到手機,但我面臨一個問題,即用戶可以同時多次調用 API 並要求轉移資金。 通常調用后他的賬戶余額不會正確,所以我搜索了很多,發現我可以使用原子事務並鎖定數據庫。 現在,如果用戶使用 API 兩次,其中一個運行正常,但另一個得到django.db.utils.OperationalError: database is locked錯誤。 知道如何正確處理它們嗎? (我可以使用一段時間並等到數據庫解鎖,但我寧願不這樣做)

模型.py

@transaction.atomic()
    def withdraw(self, amount, phone, username):
        property = transferLog.objects.filter(username=username).order_by('-time').select_for_update()[0]
        if property.property >= int(amount):
            self.username = username
            self.property = property.property - int(amount)
            self._from = username
            self._to = phone
            self.amount = int(amount)
            self.time = str(datetime.datetime.now())
            self.save()
            return {'result': 'success', 'message': 'transfer complete', 'remaining': self.property}
        else:
            return {'result': 'error', 'message': 'not enough money'}

我猜你正在使用 SQLite 數據庫。 它不允許並發寫入,即在給定時間有多個寫入操作。

你必須選擇:

  1. 要么切換到不同的數據庫
  2. 或者在設置中增加數據庫timeout選項

例子:

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'db.sqlite3',
        'OPTIONS': {
            'timeout': 60, # 1 minute
        }
    }
}

這不是一個可擴展的解決方案。 假設您有許多進程在等待寫入訪問,如果 60 秒后仍有任何進程在等待,您可能仍會收到OperationalError

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM