如何使用Berkeley DB进行简单锁定

时间:2018-09-12 06:57:59

标签: python berkeley-db

我试图对BDB哈希表进行简单的锁定,但是我总是收到这个奇怪的错误:

Traceback (most recent call last):
  File "use_db.py", line 20, in <module>
    db_env.close()
bsddb3.db.DBInvalidArgError: (22, 'Invalid argument -- Locker still has locks')

我用以下代码创建数据库:

from bsddb3 import db

db_env = db.DBEnv()
db_env.open('/home/ste/bdbtest/db', db.DB_INIT_LOCK | db.DB_INIT_MPOOL |db.DB_CREATE)
rterm_db = db.DB(db_env)
rterm_db.open('test.db', None, db.DB_HASH, db.DB_CREATE)

rterm_db.put('full_lock', 'foo')
rterm_db.put('key1', 'value1')
rterm_db.put('key2', 'value2')

rterm_db.close()
db_env.close()

我需要在更改期间更改阻止其他进程的两行的值:

db_env = db.DBEnv()
db_env.open('/home/ste/bdbtest/db', db.DB_INIT_LOCK | db.DB_INIT_MPOOL |db.DB_CREATE)
rterm_db = db.DB(db_env)
rterm_db.open('test.db', None, db.DB_HASH, db.DB_READ_UNCOMMITTED)

locker_id = db_env.lock_id()
lock = db_env.lock_get(locker_id, 'full_lock', db.DB_LOCK_WRITE)

rterm_db.put('key1', 'value3')
rterm_db.put('key2', 'value4')

db_env.lock_put(lock)
db_env.lock_id_free(locker_id)

rterm_db.close()
db_env.close()

在我看来,我正在释放锁。显然我在做错事,但是很难找到一些有关使用此DBMS之王进行锁定的示例,并且该文档相当可信!

0 个答案:

没有答案