是否需要在数据库之外进行事务性行为?

时间:2008-11-17 21:02:48

标签: database transactions persistence unit-of-work

在没有交易的情况下,我不敢在数据库中做任何复杂的事情。几乎总是有一个简单易用的内置命令。但是当你开始使用其他持久性数据时,你就不会那么简单地使用事务支持。一些例子是

  • 文件系统
  • 网络服务(我没有使用过)

即使在非持久性数据中,在异常之后撤消工作块通常也很有用。您使用语言获得的标准数据结构都不支持事务。

我想知道的是,为什么数据库是特例?

是否有任何有用的链接指向数据库外的事务行为主题?

7 个答案:

答案 0 :(得分:16)

答案 1 :(得分:9)

我认为只在数据库中看到事务的原因是,根据定义,提供事务的系统称为数据库。这听起来很圆,所以我必须详细说明。

事务支持是提供ACID属性的功能。通俗地说,这意味着事务是允许1.将一些谨慎的操作捆绑到一个包中,这个包作为一个整体成功或整体失败2.隐藏对并发用户的未提交的更改,以便3.并发用户在任何时候都有一个“一致”的系统视图。

Filesystems传统上提供一些锁定机制,但这与提供事务不同。但是,所有文件系统都具有一些原子属性。例如,如果您有目录/a//b/,并且同时尝试执行mv /a /b/amv /b /a/b,则只会执行其中一项操作,而不会影响完整性。然而,文件系统通常缺少的是能够将多个操作捆绑到一个孤立的原子束中。

An answer提到了Subversion。所有理智的版本控制系统都有交易。当提交多个文件时,系统要么完全应用提交,要么完全拒绝提交(除了CVS,我不认为是理智的)。拒绝的原因始终是同时发生的变化。版本控制系统实现者非常注意维护数据库。

Another回答将邮件系统称为事务性。我没有阅读链接材料,但答案本身只提到了消息的原子传递。那不是交易。

我在Clojure提到之前从未听说过Brian C.。在我看来,它确实是数据库上下文之外的事务的实现。这里的重点是并发控制,而不是保持持久数据的一致性。

因此,除了Clojure之外,似乎任何需要事务的系统都使用底层数据库,或者将自己变成数据库。

答案 2 :(得分:7)

现代文件系统确实有交易。它们对最终用户来说是透明的。

NTFS,XFS,JFS,EXT3和ReiserFS都可以,仅举几例。

这只是文件系统的内部。许多操作系统还支持文件锁定(例如,参见* NIX世界中的flock(2)),具有独占(写入)和共享(读取)锁定。

编辑: 如果你考虑一下,文件系统没有像现代数据库那样的隔离级别,因为一旦你读完一个文件,如果你没有锁定它,你通常会关闭它。然后当你想要写它时你重新打开它。

答案 3 :(得分:5)

Clojure使用Software Transactional Memory,它使用事务使编写多线程程序变得简单而安全,而无需手动锁定。 Clojure具有不可变的数据结构,其中包含对它们的可变引用,并且需要事务来更改引用。

答案 4 :(得分:4)

消息传递系统是事务资源管理器的另一个例子。

也就是说,您可以确保消息使用者成功处理来自队列的消息。如果处理失败,则消息将保留在队列中。

此外,消息传递系统可以与另一个资源管理器一起参与分布式事务。

的更多信息

答案 5 :(得分:3)

Subversion提交是事务性的:它们是真正的原子,因此中断的提交不会使存储库处于不一致状态。

答案 6 :(得分:1)

我遇到了将文件系统和数据库视为一个事务单元所需的情况。

在我的情况下,我只需要将一组文件下载到文件系统中。我是通过每次创建随机目录,将数据放在那里,并将目录名存储在数据库表中来实现的。因此,我的所有数据库工作以及数据库表中的目录名(= filesystem work)都可以在一个数据库事务中完成。

http://www.databasesandlife.com/atomic-operations-over-filesystem-and-database/