Как сделать простую блокировку с помощью Berkeley DB - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь сделать простую блокировку хеш-таблицы 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()

Мне кажется, что я снимаю блокировку.Очевидно, что я делаю что-то не так, но очень трудно найти некоторые примеры блокировки с этим королем СУБД, и документация довольно секретна!

...