Я пытаюсь сделать простую блокировку хеш-таблицы 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()
Мне кажется, что я снимаю блокировку.Очевидно, что я делаю что-то не так, но очень трудно найти некоторые примеры блокировки с этим королем СУБД, и документация довольно секретна!