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