事务是所有数据库系统的一个基本概念。 一次事务的要点就是它把多个步骤捆绑成了一个单一的,不成功则成仁的操作。 其它并发的事务是看不到在这些步骤之间的中间状态的,并且如果发生了一些问题, 导致该事务无法完成,那么所有这些步骤都完全不会影响数据库。
比如,假设一个银行的数据库包含各种客户帐户的余额,以及每个分行的总余额。 假设我们要记录一次从 Alice 的帐户到 Bob 的帐户的金额为 $100.00 的支付动作。那么,完成这个任务的简单到极点的 SQL 命令象下面这样
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Alice');
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = 'Bob');
这些命令的细节在这儿并不重要;重要的是这里牵涉到了好几个独立的更新来完成这个相当简单的操作。 我们的银行官员会希望要么所有这些更新都生效,要么全部不起作用。 我们当然不希望一次系统崩溃就导致 Bob 收到 100 块不是 Alice 支付的钱, 也不希望 Alice 老是不花钱从 Bob 那里拿到物品。我们需要保证:如果在操作的过程中出了差错, 那么所有这些步骤都不会发生效果。把这些更新组合成一个事务就给予我们这样的保证。 事务被认为是原子的:从其它事务的角度来看,它要么是全部发生,要么完全不发生。
我们还需要保证:一旦一个事务完成并且得到数据库系统的认可, 那么它必须被真正永久地存储,并且不会在随后的崩溃中消失。 比如,如果我们记录到了一个 Bob 撤单的动作, 那么我们不希望仅仅在他走出银行大门之后的一次崩溃就会导致对他的帐户的扣减动作消失。 一个事务型数据库保证一个事务所做的所有更新在事务发出完成响应之前都记录到永久的存储中(也就是磁盘)。
事务型数据库的另外一个重要的性质和原子更新的概念关系密切: 当多个事务并发地运行的时候,那么每个事务都不应看到其它事务所做的未完成的变化。 比如,如果一个事务正忙着计算所有分行的余额总和, 那么它不应该包括来自 Alice 的分行的扣帐和来自 Bob 分行的入帐,反之亦然。 所以事务必须是黑白分明的,不仅仅体现在它们在数据库上产生的永久影响出发,而且体现在它们运转时的自身的可视性上。 一个打开的事务做的更新在它完成之前是其它事务无法看到的,而到提交的时候所有更新同时可见。
在 PostgreSQL 里,一个事务是通过把 SQL 命令用 BEGIN 和 COMMIT 命令包围实现的。 因此我们的银行事务实际上看起来象下面这样
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- 等等
COMMIT;
如果在该事务的过程中,我们决定不做提交(可能是我们刚发现 Alice 的余额是负数), 那么我们可以发出 ROLLBACK 命令而不是 COMMIT 命令,那么到目前为止我们的所有更新都会被取消。
PostgreSQL 实际上把每个 SQL 语句当做在一个事务中执行的来看待。 如果你没有发出 BEGIN 命令,那么每个独立的语句都有一个隐含的 BEGIN 和(如果成功的话) COMMIT 语句包围在周围。 一组包围在 BEGIN 和 COMMIT 语句中间的语句有时候被称做事务块。
注意: 一些客户库自动发出 BEGIN 和 COMMIT, 因此你可能不需要特意请求就可以获取事务块的效果。查看你使用的接口的文档。
我们可以通过使用 savepoints 的方法,在一个事务里更加精细地控制其中的语句。 保存点允许你有选择性地抛弃事务中的某些部分,而提交其它剩下的。 在用 SAVEPOINT 定义了一个保存点后,如果需要,你可以使用 ROLLBACK TO 回滚到该保存点。 则该事务在定义保存点到回滚到它之间的所有数据库更改都被抛弃,但是在保存点之前的修改将被保留。
在回滚到一个保存点之后,这个保存点仍然保存着其定义,所以你可以回滚到这个位置好几次。 当然,如果你确信你不需要再次回滚到一个保存点,那么你可以释放它,这样系统可以释放一些资源。 要记住:释放或者回滚到一个保存点都会自动释放在其后定义的所有保存点。
所有这些都发生在一个事务块内部,所以所有这些都不可能被其它事务会话看到。 当且仅当你提交了这个事务块,这些提交了的动作才能以一个单元的方式被其它会话看到, 而回滚的动作完全不会再被看到。
还记得我们的银行数据库吗?假设我们从 Alice 的帐户上消费 $100.00, 然后给 Bob 的帐户进行贷记加款,稍后我们发现我们应该给 Wally 的账号贷记加款。 那么我们可以像下面这样的保存点来做:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
-- 呀!加错钱了,应该用 Wally 的账号
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT;
这个例子当然是实在太简单了,但是通过使用保存点,我们可以对事务块有大量的控制。 并且,ROLLBACK TO 是除了事务全部回滚,重新来过之外的唯一可用的, 用于重新控制一个因错误而被系统置于退出状态下的事务的方法。
分享到:
相关推荐
1. **事务概念** 事务是一个不可分割的操作序列,具有原子性,即事务中的所有操作要么全部执行,要么全部不执行。事务保证了数据库的一致性,确保在事务开始和结束之间,数据库始终处于合法状态。事务通常以`COMMIT...
本书主要阐述事务概念是如何用于解决分布式系统问题的,以及这些概念如何使我们能够在有限的资金和风险范围内建立高性能、高可用性的应用系统。本书内容广泛,从系统的角度全面阐述事务处理的概念和技术,涉及终端上...
GBase 8s 是一款高性能、高可用性的分布式数据库系统,尤其在大数据处理领域有着广泛的应用。在数据库管理中,事务是确保数据一致性、完整...理解并掌握这些事务概念对于有效管理和优化GBase 8s数据库的性能至关重要。
在本教程中,我们将深入探讨SQLite中的一个重要概念——事务(Transaction),以及如何在Android中进行事务操作和测试。 首先,我们需要理解什么是数据库事务。在关系型数据库中,事务是一组数据库操作,这些操作被...
如果你正在学hibernate框架,我认为这份文档对你会有很大的关系。 如果你真的需要可以下载啊,积分又不是很多是吧,关键能学到知识就行了
事务处理 概念与技术
数据库事务:对数据库事务的讲解,事务的概念 理解事务的特性、分类
1. Early Beginnings:事务概念的提出可以追溯到20世纪60年代,数据库管理系统的出现。事务的ACID特性是指原子性、 一致性、隔离性和持久性。 2. 2PC(Two-Phase Commit):是分布式事务中最常用的实现技术之一。它...
本教程将深入探讨Spring中的事务管理,包括编程式事务管理和声明式事务管理,以及基础的事务概念。 首先,我们来理解事务的基本概念。事务是数据库操作的逻辑单位,它包含了多个数据库操作,并且这些操作要么全部...
- **XA 事务概念**:包括准备阶段(Prepare Phase)、提交阶段(Commit Phase)和回滚阶段(Rollback Phase)等核心概念。 #### 四、XA 和 Oracle 控制的分布式事务的使用 - **XA 和 Oracle 控制的分布式事务的...
##### 2.1 事务概念 在数据库操作中,事务是指一系列操作作为一个完整的单元来执行。这些操作要么全部成功,要么全部失败。事务具备ACID特性: - **原子性**(Atomicity):整个事务被视为一个不可分割的最小工作...
#### 一、分布式事务概念及重要性 在现代软件架构中,随着业务复杂度的提升以及系统规模的扩大,单一应用已经很难满足实际需求,分布式系统应运而生。分布式系统由多个独立运行的服务组成,这些服务之间通过网络...
1. **事务概念**:在数据库中,事务是一系列操作的集合,这些操作要么全部成功,要么全部回滚,以保持数据的一致性。事务是确保数据库在多用户环境下正确运行的关键机制。 2. **ACID属性**:事务必须遵循ACID(原子...
#### 一、事务概念及重要性 在数据库管理系统(DBMS)中,事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。如果这些操作中的一个失败,则整个事务将被回滚以确保数据一致性。事务处理是确保数据完整...
事务的基本概念和在不同环境下如何使用事务。
) .findAndModify node.js 中 mongodb 事务概念的证明。用法 $ git clone git@github.com:rusintez/mongodb-transactions.git mt$ cd mt$ npm install$ node index.js应用程序接口 var transaction = require ( './...
在理解Ofbiz中的事务处理之前,我们先要回顾一下Java中的事务概念。 Java的事务分为本地事务和全局事务。本地事务是通过设置JDBC连接的`setAutoCommit(false)`来手动开启的,所有在这个连接上的操作都将被包含在一...
根据提供的文件信息,我们可以深入探讨事务处理的概念和技术,特别是这些技术在实时数据库系统中的应用。 ### 事务处理概念 #### 定义 事务是数据库管理中的一个基本操作单元,它包含一系列的操作,这些操作要么...
### 事务概念 在Oracle中,事务是确保数据库数据一致性的机制。事务由一系列相关的DML(数据操纵语言)语句组成,这些语句必须要么全部成功,要么全部撤销,以保证数据的一致性。例如,当执行一个转账操作时,通常...
#### 事务概念 事务在数据库管理中扮演着极其重要的角色,它是应用程序中的一个逻辑工作单元,通常包含一系列操作。这些操作作为一个整体被执行:要么全部完成,要么全部都不执行。事务的核心目标是保持数据库的...