在谈论数据库系统时,什么构成了事务层?

时间:2012-01-26 17:41:41

标签: transactions leveldb

例如,LevelDB不支持多语句事务。我在某处读到你必须处理“事务层”中的那些。

该层必须做什么才能将事务支持添加到不支持事务的低级库?

2 个答案:

答案 0 :(得分:1)

define transactions有多种方式,有多种方法可以实现它们。交易的一个共同特性就是它是ACID:

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

交易可能有几种状态:

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

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

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

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

问:

  

该层必须做什么才能将事务支持添加到不支持事务的低级库?

这取决于您如何定义交易。如果您定义具有上述属性的事务,并且您希望事务是ACID,那么您必须弄清楚是否可以使用LevelDB(大多数ACID属性已集成),然后您必须在LevelDB周围编写一个包装器,确保正确维护事务的状态。但是,我不完全确定单独使用包装器会这样做,因此您可能必须实际获取源代码并将其修改为真正支持事务。

答案 1 :(得分:1)

鉴于您的数据库是单线程的,您可以执行以下操作:

  1. 使用leveldb批处理功能:不要覆盖旧密钥,而是创建一个新密钥。同时记录密钥的新旧值。

  2. 如果此时数据库崩溃,请查找日志记录并通过将属于事务的部分的重新键重新回滚到旧值。删除日志以完成回滚。

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

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

    如果数据库是多线程的,你必须使用MVCC(参见Yahoo的Omid,PostgreSQL,Wiredtiger,bsddb ......)和类似精确可序列化的快照隔离(PSSI)。