什么是数据库事务?

175

有人能够提供一个简单明了但不过于简化的关于计算机事务的解释吗?

14个回答

336

一个事务是您希望将其视为“整体”的工作单元。它必须完整发生或完全不发生。

一个经典的例子是从一个银行账户转账到另一个账户。要完成这个操作,您首先必须从源账户中提取相应金额,并将其存入目标账户中。该操作必须完全成功。如果在一半停止,则资金将丢失,这是非常糟糕的。

在现代数据库中,事务还会执行其他一些操作,例如确保您无法访问其他人已经写入一半的数据。但基本思想是相同的 - 事务存在的目的是确保无论发生什么情况,您所处理的数据都处于合理的状态。它们保证不会出现这样的情况,即从一个账户中提取了资金,但没有存入另一个账户中。


112

事务是表示状态更改的一种方式。事务通常具有四个属性,通常称为ACID:

  • 原子性(如果更改已提交,则会一次性完成;您永远不会看到“一半的更改”)
  • 一致性(只有新系统状态将有效时,更改才能发生;任何尝试提交无效更改都将失败,使系统保持在先前的有效状态)
  • 隔离性(除非事务已提交,否则没有人可以看到事务的任何部分)
  • 持久性(一旦更改发生-如果系统说事务已提交,则客户端无需担心“刷新”系统以使更改“粘住”)

有关详细信息,请参见Wikipedia ACID 条目。

虽然这通常适用于数据库,但并非必须如此。(特别是,请参见软件事务内存.)


70

这里有一个简单的解释。您需要将100元从A账户转移到B账户。您可以选择以下两种方式:

accountA -= 100;
accountB += 100;

或者

accountB += 100;
accountA -= 100;
如果在一对操作的第一次和第二次之间出现问题,那么你就会有麻烦——要么100美元消失了,要么它们突然冒出来了。
事务是一种机制,允许你标记一组操作并以这样的方式执行它们,使得它们都被执行(commit),或者系统状态就像它们根本没有开始执行一样回滚(rollback)。
beginTransaction;
accountB += 100;
accountA -= 100;
commitTransaction;

将要么转移100美元,要么使两个账户保持初始状态。


39

“一系列数据操作语句必须完全执行或完全失败,以确保数据库处于一致状态。”


6
不只是数据库。我们可以将这个概念扩展到其他组件,比如排队服务或外部系统的状态。因此,“一系列数据操作语句必须完全成功或完全失败,使系统处于一致的状态。” - Michał Chaniewski

11

“事务”是指一组或多组SQL操作被视作一个单元来执行。

具体而言,每个事务似乎都在隔离状态中运行,并且如果系统发生故障,则每个事务要么全部执行,要么全部不执行。

事务的概念源于两个完全独立的问题。一个问题涉及到多个客户端并发访问数据库,另一个问题涉及到具有系统故障恢复能力的系统。

事务支持所谓的ACID属性:

  • A: 原子性(Atomicity);
  • C: 一致性(Consistency);
  • I: 隔离性(Isolation);
  • D: 持久性(Durability)。

5

3
根据《数据库基础》一书(Sharma等人,2010年,第162页)的说法,事务或工作单元是一组数据库操作,这些操作都必须成功执行,才能称之为事务成功。
例如,如果银行需要将1,000美元从帐户A转账到帐户B,则在转账成功之前需要执行以下步骤:
- 将帐户A的余额减少1,000美元 - 将帐户B的余额增加1,000美元
参考文献:
Sharma、N.、Perniu、L.、Chong、R. F.、Iyer、A.、Nandan、C.、Mitea、A. C.、Nonvinkere、M.和Danubianu、M. (2010)。《数据库基础》。

1
我建议更有用的是“事务处理”的定义,因为它涵盖了计算机科学中的事务概念。
来自维基百科:
在计算机科学中,事务处理是将信息处理分成单个、不可分割的操作,称为事务。每个事务必须作为一个完整的单位成功或失败;它不能保持在中间状态。

http://en.wikipedia.org/wiki/Transaction_processing#Implementations


1
除了上述的回应之外,需要注意的是,在理论上,参与事务的资源种类没有任何限制。
大多数情况下,只涉及到一个或多个不同的数据库,但也可以想象打印机参与事务,并且可能会导致事务失败,例如纸张卡住的情况。

1

事务 - 只是一组逻辑上组合在一起的操作,您希望它们全部被提交或回滚。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接