【问题标题】:Is Software Transactional Memory the same as database transactions?软件事务内存与数据库事务相同吗?
【发布时间】:2010-03-22 20:54:43
【问题描述】:

我已经阅读了很多关于软件事务内存的内容,尤其是与 Haskell 相关的内容,但我试图弄清楚它与数据库事务有何不同? STM有什么我不理解的优点吗?

【问题讨论】:

    标签: database haskell concurrency transactional-memory


    【解决方案1】:

    软件事务内存中的“事务”概念是从数据库中明确借用的。不同之处在于交易的实施地点和使用方式。

    STM 是一个语言级别的概念:一系列操作在事务提交之前不会生效。通常这意味着某些全局/共享变量的值仅在事务成功时才会更改。该属性由语言运行时强制执行。没有固有的持久性概念:事务中涉及的变量本质上可能是纯动态的(例如,工作队列的大小)。

    数据库事务是一个应用程序级的概念:一系列数据操作在事务提交之前不会生效。因为这是一个数据库,所以持久化是基础:在数据库内部“生效”的意思是数据保存在某个持久化存储中。

    您可能会使用数据库和数据库事务来实现 STM 风格的算法,但您会失去语言级实现的易用性和便利性(在大多数情况下可能还会失去性能)。

    【讨论】:

    • “操作”是什么意思?你的意思是运行代码吗?
    • 是的,完全正确。在 STM 中,事务中代码的影响(例如,对变量的赋值、I/O)在事务“提交”之前是不可见的。
    【解决方案2】:

    STM 事务与数据库事务有很多共同点。特别是,在对数据库设计者很重要的 ACID 属性中,STM 提供了原子性和隔离性。然而,一致性取决于程序员——例如,您可以编写违反内部数据结构不变量的 STM 事务。最后,STM 事务通常不是持久的;结果存储在易失性 RAM 中,如果机器在成功交易后崩溃,结果可能会丢失。在我看来,这可能是 STM 事务和数据库事务之间最显着的区别。

    【讨论】:

    • 如果你可以在类型系统中编码你的不变量,那么你就不能写不一致。
    【解决方案3】:

    STM主要用于并发,而数据库事务则是关于数据一致性的。

    【讨论】:

    • 在数据库中有可以指定和维护的显式不变量,主要是关于保留跨表的关键字段之间的映射。如果我有表“客户”和“地址”,那么我可以指定每个地址必须有一个匹配的客户,并且数据库将维护它。 Haskell STM 不这样做。
    • @Paul 在我看来,这种一致性并不是数据库独有的。您始终可以在 STM 事务中强制执行不变量。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2010-12-10
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多