Database 数据库事务-它们是如何工作的?

Database 数据库事务-它们是如何工作的?,database,transactions,Database,Transactions,我试图学习更多关于数据库事务的知识,我找到了编写事务的经验法则,并思考了几个问题 经验法则: 交易必须: 原子-它是一个工作单元,不依赖于以前和以后的工作 以下交易 一致-数据已提交或回滚,否 “介于两者之间”的情况下,某物 已更新,但有些内容尚未更新 孤立-没有事务看到当前事务的中间结果 交易 持久-如果数据已提交,即使 之后系统就崩溃了 我想知道它们是如何运作的,这样我就可以更好地理解在编写这样的交易时需要考虑的因素。我想具体的细节在可用的数据库实现之间会有所不同,但某些规则总是存在的 数据

我试图学习更多关于数据库事务的知识,我找到了编写事务的经验法则,并思考了几个问题

经验法则:

交易必须:

  • 原子-它是一个工作单元,不依赖于以前和以后的工作 以下交易
  • 一致-数据已提交或回滚,否 “介于两者之间”的情况下,某物 已更新,但有些内容尚未更新
  • 孤立-没有事务看到当前事务的中间结果 交易
  • 持久-如果数据已提交,即使 之后系统就崩溃了
  • 我想知道它们是如何运作的,这样我就可以更好地理解在编写这样的交易时需要考虑的因素。我想具体的细节在可用的数据库实现之间会有所不同,但某些规则总是存在的

  • 数据库如何在仍然支持原子规则的情况下处理并发事务?
    • 是否存在按顺序处理的事务队列
    • 如何处理阻碍所有其他交易的冗长交易
  • 是否在内存中更新表,以便在提交之前发生崩溃时,不会对数据库进行任何更改?
    • 或者是否有一些中间表经过更新以在这样的崩溃中生存
  • 当事务正在进行时,是否阻止对受影响表的所有读写访问?
    • 或者数据库是否允许写入,但事务将在提交时覆盖所有更改

  • 实际的细节可能在某种程度上取决于它是哪个DB服务器,但本文可能会引起您的兴趣:

  • 有许多不同的方法,包括事务排队、乐观并发控制等。这实际上是一个非常复杂的问题,有很多书都是关于它的:

  • 这取决于数据库中的日志记录级别。如果保留严格的预写日志,那么在系统崩溃的情况下,数据库可以恢复到一致状态

  • 这取决于并发的类型。乐观并发不涉及锁,但是如果事务完成后数据库的状态发生了变化,那么它将被放弃并重新启动。这可以加速碰撞很少的dbs。还有不同级别的锁定:行、表,甚至整个数据库


  • 这些都是非常复杂的问题,我建议你买本书,或者参加一个并发系统系列讲座,如果你想完全回答这些问题的话:-)

    对你的定义有一些挑剔:

    原子-它是一个工作单元,不依赖于以前和以后的事务

    更正确的原子性定义不会提及任何“之前或之后”的事务。原子性是一个事务本身的属性,也就是说,在最后的倒计时中,它的所有动作要么持续,要么根本没有动作。换言之,不应允许“仅半笔交易”持续存在

    但是,嵌套事务、保存点以及用户请求显式回滚到已获取保存点的能力等概念模糊了该概念。从某种意义上说,这些确实允许“只有一半的事务操作”持续存在,所有这些都是根据显式用户的请求进行的

    一致-数据要么提交,要么回滚,没有“中间”情况,即某些内容已更新,而某些内容尚未更新

    这种解释是完全错误的。一致性意味着事务处理器(在本例中为DBMS引擎)不能使系统(数据库)处于违反其(事务处理器)所意识到的任何声明约束的状态。例如,见第16章“数据库系统简介”

    孤立-没有事务看到当前事务的中间结果

    挑剔:除当前事务外,不允许任何事务看到中间状态(状态,而不是真正的结果)。请进一步注意,事务处理引擎的“隔离级别”通常定义I属性被违反的程度

    持久-如果数据已提交,即使系统在提交后立即崩溃,这些值也会保持不变

    但由于嵌套事务的可能性,这个属性也变得模糊了一点。即使内部事务已提交并完成,包含该事务的事务仍可以通过自身完全回滚来撤消该提交。

    嵌套事务的结论是什么

    没有定论。存在嵌套事务。酸的性质存在。他们被迫共存。没有绝对。当然不是酸

    一致-数据已提交 或者回滚,没有“中间”的情况 更新了一些内容,并且 有些东西没有

    我不同意埃尔文·斯穆特(Erwin Smout)关于“一致性”是什么意思的观点——你的解释更接近金钱。根据我对的解释,一致状态超出了系统声明的约束

    在通过借记一个账户和贷记另一个账户在两个账户之间转账的情况下,系统可能处于几个状态:

  • 两个账户都持有初始余额
  • 金额从一个账户余额中扣除,但不计入另一个账户余额
  • 金额从一个账户余额中增加,但不从另一个账户余额中扣除
  • 两个账户都有最终余额

  • 在所有四种状态下,系统的完整性约束都可以保持。但是第二个和第三个不符合系统的合理观点——钱应该在某个地方。所以这些状态是不一致的,而初始状态和最终状态是一致的