事务
体味数据一律性
什么是数据一律性?回覆这个成果的最佳方式是议决研讨示例。假定您的公司拥有多家连锁饭店,公司用一个数据库来跟踪每家饭店中的货色存储量。为了使货色倾销过程更随意对付,数据库包含每个连锁店的库存表。每当一家饭店收到或用丧失一局部货色时,与该饭店呼应的库存表就会被修正以反映库存革新。
目下当今,假定从一家店分配多少瓶番茄酱到另一家店。为了准确地透露发挥分析这一次库存分配,调出方饭店表中存储的番茄酱瓶数必需削减,而接收方饭店表中存储的番茄酱瓶数必需添加。若是用户削减了调出方饭店库存表中的番茄酱瓶数,但没有添加接收方库存表中的番茄酱瓶数,则数据就会变得纷比如致。此时一切连锁店的番茄酱的总瓶数不再准确了。
若是用户忘记了举行一切需要的更动(正如在前面的示例中一样),大概若是在用户举行更动的过程中零碎崩溃了,又大概若是数据库使用步骤由于某种启事过早地停止了,数据库中的数据都市变得纷比如致。当几个用户同时接见相反的数据库表时,也能够孕育发生纷比如致。为了戒备数据的纷比如致(尤其是在多用户现象中),DB2 的计划中集成了下列数据一律性支撑机制:
- 事务
- 中断中止级别
- 锁
事务和事务鸿沟
事务(也称为事情单位)是一种将一个或多个 SQL 把持组分化一个单位的可光复把持序列,往常位于使用步骤过程中。事务的启动和停止定义了数据库一律性点;要么将一个事务中执行的一切 SQL 把持的成果都使用于数据库(提交),要么完全勾销并丢弃已执行的一切 SQL 把持的成果(回滚)。
运用从 Command Center、Script Center 或 Command Line Processor 运转的嵌入式 SQL 使用步骤和剧本,在可执行 SQL 语句第一次执行时(在设立建立与数据库的连接之后或在现有事务停止之后),事务就会自动启动。在启动事务之后,必需由启动事务的用户或使用步骤显式地停止它,除非运用了称为自动提交(automatic commit) 的过程(在这种现象下,收回的每个单独的 SQL 语句被看作单个事务,它一执行就隐式地提交了)。
在年夜多半现象下,议决执行 COMMIT 或 ROLLBACK 语句来停止事务。当执行 COMMIT 语句时,自从事务启动以来对数据库所做的一切更动就成为永世性的了 —— 即,它们被写到磁盘。当执行 ROLLBACK 语句时,自从事务启动以来对数据库所做的一切更动都被撤消,而数据库前往到事务开始之前所处的状况。不管是哪种现象,数据库在事务完成时都保证能回到一律状况。
必定要注意一点:固然事务议决确保对数据的更动仅在事务被乐成提交之后才成为永世性的,从而提供了浅近的数据库一律性,但还是需要用户或使用步骤来确保每个事务中执行的 SQL 把持序列一向会招致一律的数据库。
COMMIT 和 ROLLBACK 把持的后果
正如在前面提到的,往常议决执行 COMMIT 或 ROLLBACK SQL 语句来停止事务。为了体味这些语句怎样事情,研讨一个示例是有协助的。
若是按所示的序次执行下列 SQL 语句:
清单 1. 由三个事务构成的朴实事情负载
CONNECT TO MY_DB
CREATE TABLE DEPARTMENT (DEPT_ID INTEGER NOT NULL, DEPT_NAME VARCHAR(20))
INSERT INTO DEPARTMENT VALUES(100, 'PAYROLL')
INSERT INTO DEPARTMENT VALUES(200, 'ACCOUNTING')
COMMIT
INSERT INTO DEPARTMENT VALUES(300, 'SALES')
ROLLBACK
INSERT INTO DEPARTMENT VALUES(500, 'MARKETING')
COMMIT
这将创设一个名为 DEPARTMENT 的表,它的结构如下所示:
DEPT_ID
DEPT_NAME
100
PAYROLL
200
ACCOUNTING
500
MARKETING
这是由于当执行第一个 COMMIT 语句时,创扬名为 DEPARTMENT 的表并向 DEPARTMENT 表中拔出两条记载,这两个把持都市酿成永世性的。另一方面,当执行 ROLLBACK 语句时,删除拔出 DEPARTMENT 表中的第三条记载,该表前往到执行拔出把持之前所处的状况。着末,当执行第二个 COMMIT 语句时,拔出到 DEPARTMENT 中的第四条记载成为永世性的,而数据库再次前往到一律状况。
正如可以从这个示例中看到的,提交或回滚把持只影响在这个把持所终了的事务内做出的更动。只需数据更动依然未被提交,其他用户和使用步骤往常就无法瞥见它们(也有例外现象,稍后我们将举行接洽),并可以议决执行回滚把持勾销它们。然则,一旦数据更动被提交了,其他用户和使用步骤就可以接见它们,而且再也不能议决回滚把持勾销它们了。
不乐成事务的后果
我们适才已看到当议决 COMMIT 或 ROLLBACK 语句停止事务时会孕育发生什么。然则,若是在事务完成前泛起零碎漏洞,那会孕育发生什么现象呢?在这种现象下,DB2 数据库操持步骤会勾销一切未提交的更动,从而恢双数据库一律性(假定在事务启动时存在这样的一律性)。图 1 对比了乐成的事务和在乐成停止之前丧失败的事务的后果。
图 1. 对比乐成的和不乐成的事务
版权声明:
原创作品,容许转载,转载时请务必以超链接体式格局标明文章 原始来由 、作者信息和本声明。不然将究查司法责任。