LMDB未关闭连接会提交事务吗?Ruby崩溃未调用close()的影响
LMDB崩溃未关闭事务的状态说明
针对你用Ruby绑定minad/lmdb时遇到的崩溃场景,直接说结论:
- 未提交的读写事务会自动回滚,已提交的事务完全不受影响
- 只读事务会自动释放资源,不会留下任何阻塞或不一致的状态
具体细节:
读写事务
LMDB的读写事务依赖进程持有的文件锁和事务ID,当Ruby程序崩溃时,操作系统会强制释放该进程持有的所有锁。下次启动LMDB时,库会自动检测到崩溃的未提交事务,将所有未完成的修改回滚到事务开始前的状态,完全保证数据一致性,不需要你手动修复。只读事务
只读事务只是创建了一个数据快照,不持有排他锁,也不会修改磁盘数据。进程崩溃后,LMDB会自动回收该事务占用的内存和快照资源,不会对后续的读写操作造成任何阻碍,也不会产生数据残留。和Redis的差异补充
你要替代Redis,这点得明确:Redis是内存优先,未持久化的修改崩溃后直接丢失;而LMDB是磁盘存储的ACID数据库,崩溃恢复是内置核心特性,所有未提交的写操作都会被自动撤销,数据始终处于一致状态,不用依赖RDB/AOF这类额外的持久化机制来兜底。
另外要注意,minad/lmdb只是LMDB的Ruby绑定,底层事务逻辑完全由LMDB的C库处理,所以上述行为和原生LMDB完全一致,不用担心Ruby层的特殊情况。
内容的提问来源于stack exchange,提问作者WuMing2
相关产品推荐
相关产品推荐

