例如,LevelDB不支持多语句事务。我在某处读到你必须处理“事务层”中的那些。
该层必须做什么才能将事务支持添加到不支持事务的低级库?
答案 0 :(得分:1)
define transactions有多种方式,有多种方法可以实现它们。交易的一个共同特性就是它是ACID:
交易可能有几种状态:
LevelDB does not support transactions,但它确实有一些ACID属性:
所以...回到你的问题:
问:
该层必须做什么才能将事务支持添加到不支持事务的低级库?
答强> 这取决于您如何定义交易。如果您定义具有上述属性的事务,并且您希望事务是ACID,那么您必须弄清楚是否可以使用LevelDB(大多数ACID属性已集成),然后您必须在LevelDB周围编写一个包装器,确保正确维护事务的状态。但是,我不完全确定单独使用包装器会这样做,因此您可能必须实际获取源代码并将其修改为真正支持事务。
答案 1 :(得分:1)
鉴于您的数据库是单线程的,您可以执行以下操作:
使用leveldb批处理功能:不要覆盖旧密钥,而是创建一个新密钥。同时记录密钥的新旧值。
如果此时数据库崩溃,请查找日志记录并通过将属于事务的部分的重新键重新回滚到旧值。删除日志以完成回滚。
如果提交了事务,请删除旧密钥并删除日志条目以完成提交。
然后,您有一个使用多个版本的单线程键/值存储的事务。
如果数据库是多线程的,你必须使用MVCC(参见Yahoo的Omid,PostgreSQL,Wiredtiger,bsddb ......)和类似精确可序列化的快照隔离(PSSI)。