我使用 ZODB 作为将通过 Web 服务修改的对象的持久存储。下面是我减少问题的一个例子。增量函数是从多个线程调用的。我的问题是,当从两个线程同时调用增量时,对于不同的键,我得到了冲突错误。
我想应该可以解决这个问题,至少只要修改不同的键,以适当的方式?如果是这样,我没能找到一个关于如何...的示例(zodb-documentation 似乎有些分散在不同的站点:/)
很高兴有任何想法...
import time
import transaction
from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
from ZODB.POSException import ConflictError
def test_db():
store = FileStorage('zodb_storage.fs')
return DB(store)
db_test = test_db()
# app here is a flask-app
@app.route('/increment/<string:key>')
def increment(key):
'''increment the value of a certain key'''
# open connection
conn = db_test.open()
# get the current value:
root = conn.root()
val = root.get(key,0)
# calculate new value
# in the real application this might take some seconds
time.sleep(0.1)
root[key] = val + 1
try:
transaction.commit()
return '%s = %g' % (key, val)
except ConflictError:
transaction.abort()
return 'ConflictError :-('