2012-01-26 37 views

回答

1

define transactions有多种方式,并且有各种方式来实现它们。交易的共同财产是它的ACID:

  • 原子性 - 全有或全无。数据库事务的所有任务都必须完成;如果由于任何可能的原因而不完整,则数据库事务必须中止。
  • 一致性 - 可串行性和完整性。在数据库事务之前和之后,数据库必须处于一致或合法的状态。这意味着数据库事务不能破坏数据库完整性约束。
  • 隔离在执行数据库事务期间使用的数据在执行完成之前不能被其他数据库事务使用。因此,一个未完成事务的部分结果必须不能用于其他事务,直到事务成功提交。这也意味着事务的执行不受其他并发事务的数据库操作的影响。
  • 耐用性即使交易完成后发生系统故障,交易的所有数据库修改都将永久生效。

事务可以有几种状态:

  • 活动状态:它分为两个阶段。初始阶段:数据库事务处于此阶段,而其语句开始执行。部分承诺阶段:数据库事务在其最终语句执行时进入此阶段。在这个阶段,数据库事务已经完成了它的执行,但仍然有可能中止事务,因为执行的输出可能会暂时驻留在主内存中 - 硬件故障等事件可能会擦除输出。
  • 失败状态:当数据库事务由于硬件或程序错误而无法继续正常执行时,将进入失败状态)。
  • 中止状态:数据库事务如果由DBMS确定失败,则进入中止状态。被中止的事务对数据库不会产生任何影响,因此对数据库所做的任何更改都必须撤消或以技术术语回退。当中止的事务已被回滚时,数据库将返回到其一致状态。 DBMS的恢复方案负责管理事务中止。
  • 承诺状态:在完成成功执行后,有足够的信息写入磁盘后,数据库事务进入提交状态。在这种状态下,如此多的信息被写入磁盘,交易产生的影响不能通过中止撤消;即使发生系统故障,当系统重新启动时,已提交事务所做的更改也可以重新创建。

LevelDB does not support transactions,但它确实有一些ACID属性:

  • 批量写是原子。
  • 一致性取决于你。
  • 有限的隔离支持。
  • 耐久性是一个可配置的选项。

所以......回到你的问题:

问:

什么会这层必须做的事务支持添加到较低级别的库,不支持交易?

答: 这取决于你如何定义一个事务。如果你用上述属性定义一个事务,并且如果你希望你的事务是ACID,那么你必须弄清楚是否可以用LevelDB(大多数ACID属性被集成),然后你必须在LevelDB上编写一个包装器,确保事务状态得到正确维护。但是,我不完全确定一个包装器本身会这样做,所以您可能不得不真正采用源代码并将其修改为支持事务处理的真正。

1

鉴于你的数据库是单线程的,你可以做到以下几点:

  1. 使用性LevelDB批处理功能:除了覆盖旧钥匙的,创建一个新的。还记录密钥的旧值和新值。

  2. 如果此时数据库崩溃,请查看日志记录,并通过将作为事务一部分的键重新设置为旧值来回滚事务。删除日志以完成回滚。

  3. 如果事务已提交,请删除旧密钥并删除日志条目以完成提交。

然后,您有一个使用多个版本的单线程键/值存储的事务。

如果数据库是多线程的,您必须使用MVCC(请参阅Yahoo的Omid,PostgreSQL,Wiredtiger,bsddb ...)以及诸如Precisely Serializable Snapshot Isolation(PSSI)之类的东西。