簡體   English   中英

Python應用程序級別的文檔/記錄鎖定(例如,用於MongoDB)

[英]Python app-level document/record locking (eg. for MongoDB)

介紹

MongoDB不提供鎖定文檔的方法(例如RDBMS中的SELECT FOR UPDATE)。

推薦了一種隔離操作序列的方法,有時也稱為樂觀鎖定 ,但是在某些情況下,這種方法似乎過於復雜甚至效率低下(這就是為什么仍使用悲觀鎖定的原因)。

任務

我想在應用程序級別實現通用文檔鎖定。 假設我只有一個應用程序可以處理集合。 而且我的應用程序是多線程的

使用場景:

with DocumentLock(doc_id):
  # make sure no other thread interferes
  doc=db.doc_collection.find_one(doc_id)
  ... # analyse and update the document
  db.doc_collection.save(doc)

您會為任務推薦什么解決方案?

這是我的DocumentLock類:

class DocumentLock(object):

  _lock=RLock() # protects access to _locks dictionary
  _locks=WeakValueDictionary()

  def __init__(self, doc_id):
    self.doc_id=doc_id

  def __enter__(self):
    with self._lock:
      self.lock=self._locks.get(self.doc_id)
      if self.lock is None:
        self._locks[self.doc_id]=self.lock=RLock()
    self.lock.acquire()

  def __exit__(self, exc_type, exc_value, traceback):
    self.lock.release()
    self.lock=None # make available for garbage collection

所以基本上我有一個RLocks字典,每個訪問的文檔一個RLock。 我使用弱引用來擺脫未使用的鎖。

可以為需要記錄鎖定的每個集合(或表)子類化DocumentLock。

這一切似乎都可行(盡管未在並發下進行測試),但我不確定這種方法是否存在弱點,或者是否有更好的方法。

暫無
暫無

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

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