Transactions 当谈到数据库系统时,什么构成了事务层?

Transactions 当谈到数据库系统时,什么构成了事务层?,transactions,leveldb,Transactions,Leveldb,例如,不支持多语句事务。我在某个地方读到,您必须在“事务层”中处理这些问题 该层需要做些什么才能将事务支持添加到不支持事务的较低级别库中?有各种方法来实现事务,也有各种方法来实现它们。事务的一个常见属性是它是ACID: 原子性-要么全有,要么全无。必须完成数据库事务的所有任务;如果由于任何可能的原因而不完整,则必须中止数据库事务 一致性-可串行化和完整性。数据库事务前后必须处于一致或合法状态。这意味着数据库事务不能破坏数据库完整性约束 隔离在数据库事务执行期间使用的数据在执行完成之前不得被其他

例如,不支持多语句事务。我在某个地方读到,您必须在“事务层”中处理这些问题

该层需要做些什么才能将事务支持添加到不支持事务的较低级别库中?

有各种方法来实现事务,也有各种方法来实现它们。事务的一个常见属性是它是ACID:

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

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

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

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

Q:

该层需要做什么才能将事务支持添加到不支持事务的较低级别库中

A:
这取决于您如何定义事务。如果您使用上述属性定义事务,并且希望事务是ACID,那么您必须确定是否可以使用LevelDB(大多数ACID属性都是集成的),然后必须围绕LevelDB编写一个包装器,以确保正确维护事务的状态。但是,我不能完全确定仅包装器就可以做到这一点,因此您可能需要实际获取源代码并对其进行修改,以真正支持事务。

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

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

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

  • 如果事务已提交,请删除旧密钥并删除日志项以完成提交

  • 然后就有了一个使用多个版本的单线程键/值存储事务

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