SQL 事务
● 事务是需要在同一个处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理。
● 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种。
● DBMS的事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四种特性。通常将这四种特性的首字母结合起来,统称为ACID特性。
创建事务
- 事务开始语句
使用事务开始语句和事务结束语句,将一系列 DML 语句(INSERT/UPDATE/DELETE 语句)括起来,就实现了一个事务处理。这时需要特别注意的是事务的开始语句 A。实际上,在标准 SQL 中
并没有定义事务的开始语句,而是由各个 DBMS 自己来定义的。但事务的结束需要用户明确地给出指示。比较有代表性的开始语法如下所示:
- SQL Server、PostgreSQL:
BEGIN TRANSACTION
- BEGIN TRANSACTION:
START TRANSACTION
- Oracle、DB2:无
各示例:
BEGIN TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
COMMIT;
START TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
COMMIT;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
COMMIT;
2.事务结束语句
-
COMMIT——提交处理:
COMMIT 是提交事务包含的全部更新处理的结束指令(图 4-3),相当于文件处理中的覆盖保存。一旦提交,就无法恢复到事务开始前的状态了。万一由于误操作提交了包含错误更新的事务,就只能回到重新建表、重新插入数据这样繁琐的老路上了。
-
ROLLBACK——取消处理:
ROLLBACK 是取消事务包含的全部更新处理的结束指令(图 4-4),相当于文件处理中的放弃保存。一旦回滚,数据库就会恢复到事务开始之前的状态(代码清单 4-22)。通常回滚并不会像提交那样造成大规模的数据损失。上述事务处理执行之后,表中的数据不会发生任何改变。这是因为执行最后一行的 ROLLBACK 之后,所有的处理都被取消了。因此,回滚执行起来就无需像提交时那样小心翼翼了(即使是想要提交的情况,也只需要重新执行事务处理就可以了)
实际上,几乎所有的数据库产品的事务都无需开始指令。这是因为大部分情况下,事务在数据库连接建立时就已经悄悄开始了,并不需要用户再明确发出开始指令。例如,使用
Oracle 时,数据库连接建立之后,第一条 SQL 语句执行的同时,事务就已经悄悄开始了。
像这样不使用指令而悄悄开始事务的情况下,应该如何区分各个事务呢?通常会有如下两种情况。
- A 每条SQL语句就是一个事务(自动提交模式)
- B 直到用户执行COMMIT或者ROLLBACK为止算作一个事务
通常的 DBMS 都可以选择其中任意一种模式。默认使用自动提交模式的DBMS 有 SQL Server、PostgreSQL 和 MySQL
等 A。该模式下的 DML 语句如下所示,每一条语句都括在事务的开始语句和结束语句之中。
在默认使用 B 模式的 Oracle 中,事务都是直到用户自己执行提交或者回滚指令才会结束。
自动提交的情况需要特别注意的是 DELETE 语句。如果不是自动提交,即使使用 DELETE 语句删除了数据表,也可以通过 ROLLBACK 命令取消该事务的处理,恢复表中的数据。
但这仅限于明示开始事务,或者关闭自动提交的情况。如果不小心在自动提交模式下执行了 DELETE 操作,即使再回滚也无济于事了。这是一个很严重的问题,初学者难免会碰到这样的麻烦。
ACID特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。