数据库事务
什么是数据一致性?回答这个问题的最佳方法是通过研究示例。假定您的公司拥有多家连锁饭店,公司用一个数据库来跟踪每家饭店中的货物存储量。为了使货物采购过程更方便,数据库包含每个连锁店的库存表。每当一家饭店收到或用掉一部分货物时,与该饭店相应的库存表就会被修改以反映库存变化。
现在,假定从一家店调配若干瓶番茄酱到另一家店。为了准确地表示这一次库存调配,调出方饭店表中存储的番茄酱瓶数必须减少,而接收方饭店表中存储的番茄酱瓶数必须增加。如果用户减少了调出方饭店库存表中的番茄酱瓶数,但没有增加接收方库存表中的番茄酱瓶数,则数据就会变得不一致。此时所有连锁店的番茄酱的总瓶数不再准确了。
如果用户忘记了进行所有必要的更改(正如在前面的示例中一样),或者如果在用户进行更改的过程中系统崩溃了,又或者如果数据库应用程序由于某种原因过早地停止了,数据库中的数据都会变得不一致。当几个用户同时访问相同的数据库表时,也可能发生不一致。为了防止数据的不一致(尤其是在多用户环境中),DB2 的设计中集成了下列数据一致性支持机制:
- 事务
- 隔离级别
- 锁
事务(也称为工作单元)是一种将一个或多个 SQL 操作组合成一个单元的可恢复操作序列,通常位于应用程序进程中。事务的启动和终止定义了数据库一致性点;要么将一个事务中执行的所有 SQL 操作的结果都应用于数据库(提交),要么完全取消并丢弃已执行的所有 SQL 操作的结果(回滚)。
使用从 Command Center、Script Center 或 Command Line Processor 运行的嵌入式 SQL 应用程序和脚本,在可执行 SQL 语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后),事务就会自动启动。在启动事务之后,必须由启动事务的用户或应用程序显式地终止它,除非使用了称为自动提交(automatic commit) 的过程(在这种情况下,发出的每个单独的 SQL 语句被看作单个事务,它一执行就隐式地提交了)。
在大多数情况下,通过执行 COMMIT 或 ROLLBACK 语句来终止事务。当执行 COMMIT 语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的了 —— 即,它们被写到磁盘。当执行 ROLLBACK 语句时,自从事务启动以来对数据库所做的一切更改都被撤消,而数据库返回到事务开始之前所处的状态。不管是哪种情况,数据库在事务完成时都保证能回到一致状态。
一定要注意一点:虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的,从而提供了一般的数据库一致性,但还是需要用户或应用程序来确保每个事务中执行的 SQL 操作序列始终会导致一致的数据库。