20.1事务处理
事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行。
关系数据库设计把数据存储在多个表中,使数据更容易操纵、维护和重用。不用深究如何以及为什么进行关系数据库设计,在某种程度上说,设计良好的数据库模式都是关联的。
事务(transaction)指一组SQL语句。
回退(rollback)指撤销指定SQL语句的过程。
提交(commit)指将未存储的SQL语句结果写入数据库表。
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事物处理不同)。
可以回退那些语句?
事物处理用来管理INSERT、UPDATE和DELETE语句。不能回退SELECT语句,也不能回退CREATE或DROP操作。事务处理中可以使用这些语句,但进行回退时,它们不被撤销。
20.2控制事务处理
事物处理实现的差异:不同DBMS用来实现事物处理的语法有所不同。
管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。
BEGIN TRANSACTION
……
COMMIT TRANSACTION
20.2.1使用ROLLBACK
SQL的ROLLBACK命令用来回退SQL语句
DELETE FROM Order;
ROLLBACK;
20.2.2使用COMMIT
一般的SQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交,即提交操作是自动进行的。但是,在事务处理块中,提交不会隐含的进行。
SQL Server中例子
BEGIN TRANSACTION
DELETE OrderItems WHERE order_num = 12345
DELETE Orders Orders WHERE order_num = 12345
COMMIT TRANSACTION;
Oracle中例子
DELETE OrderItems WHERE order_num = 12345;
DELETE Orders Orders WHERE order_num = 12345;
COMMIT;
从系统中删除完全订单12345.因为涉及更新两个数据库表,所以事物处理块来保证订单不被部分删除。最后COMMIT语句仅在不出错时写出更改。如果第一条DELETE起作用,但第二条失败,则DELETE不会提交。
20.2.3使用保留点
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事物处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。
为了支持回退部分事务处理,必须能在事务处理模块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符。
在MySQL和Oracle中创建占位符,可使用如下SAVEPOINT语句:
SAVEPOINT delete1;
ROLLBACK TO delete1;
保留点越多越好:可以在SQL代码中设置任意多的保留点,越多越好,为什么呢?因为保留点越多,你就越能按自己的意愿灵活地进行回退。