Transaction processing

Mac安装使用Mysql教程(从零开始)

第十一章 管理事务处理

11.1 事务处理简介

       事务处理是确保数据库完整性的机制,它用来管理必须成批执行的 SQL 操作,保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们要么完全执行,要么完全不执行(除非明确指示)。参考下面的例子可以更好地理解事务处理的作用。

情景:向数据库中添加一个客户订单
检索数据库库是否存在相应客户,不存在则添加用户 —> 检索顾客ID —>
将Order表中新添加的行与顾客ID关联 —> 为订购的每一个物品在Order_Item中
新加一行,通过检索出来的ID将将它与Orders表关联(并且通过产品ID与Products表关联)

假设数据库出现如下故障:
1.在向Orders表添加数据之前(没有影响);
2.在向Orders表添加数据之后,Order_Item表添加数据之前(导致两个表数据不一样);
3.在向Order_Item表添加数据之时(插入的数据不完整);
解决办法:
将向Orders表和Order_Item表添加数据的操作都包含于事务中,如果出现故障,撤销一切操作。

       事务处理中的重要术语如下:

  1. 事务(transaction)指一组 SQL 语句;
  2. 回退(rollback)指撤销指定 SQL 语句的过程;
  3. 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
  4. 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退(与回退整个事务处理不同)。

       事务处理可以管理INSERT,UPDATE和DELETE语句,但不能回退SELECT语句和DROP,CREATE操作。

11.2 控制事务处理

       不同DBMS用于实现事务处理的语法有所不同,使用事务处理时要参考其对应的参考文档。管理事务的关键是将SQL语句组分解为逻辑块,并明确规定数据何时应该回退。

SQL Server

BEGIN TRANSACTION

COMMIT TRANSACTION

MySQL & MariaDB –

START TRANCATION/BEGIN

Oracle –

SET TRANCTION

PostgreSQL –

BEGIN

       大多数DBMS中没有明确标识事务在何处结束。事务是一直存在的,直到被中断。通常COMMIT表示保存更改,ROLLBACK表示撤销。

11.3 撤销和提交

       命令ROLLBACK用于回退(撤销)SQL 语句。
       一般的SQL语句都是直接对数据库表操作编写的,这被称为隐式提交,即提交(写或保存)操作是自动进行的。但对于事务处理块,不同DBMS有不同处理方法,有的不会隐式提交,有的则会。进行明确的提交时要使用COMMIT语句。
       以下为进行提交的例子,如果要回滚只需把COMMIT换为ROLLBACK即可。(MySQL的例子亲测可用,其它例子没试过)

SQL Server

BEGIN TRANSACTION
DELETE OrderItems WHERE order_num = 20005
DELETE Orders WHERE order_num = 20005
COMMIT TRANSACTION

Oracle

SET TRANSACTION;
DELETE OrderItems WHERE order_num = 20005;
DELETE Orders WHERE order_num = 20005;
COMMIT;

MySQL

START TRANSACTION;
DELETE FROM OrderItems WHERE order_num=20005;
DELETE FROM Orders WHERE order_num=20005;
COMMIT;

注意:MySQL中的命令是输入一句并执行一句的,而非把上面代码全部输入完成后执行。

11.4 使用保留点

       由之前例子可知,使用ROLLBACK和COMMIT可以实现整个事务的撤销与写入。但面对复杂事务时,有时需要部分提交或撤回。需要在事务处理块中合适的位置添加占位符来实现部分提交或撤回的功能。在SQL中,占位符被称为保留点。占位符的具体使用如下:

Oracle/MySQL/MariaDB

SAVEPOINT delete1;

ROLLBACK TO delete1;

SQL Server

SAVE TRANSACTION delete1;

ROLLBACK TRANSACTION delete1;

注意:保留点需要有一个唯一标识它的名字。

       如下是一个完整的SQL Server控制事务处理的例子:

START TRANSACTION;
INSERT INTO Customers(cust_id, cust_name)
VALUES('1000000011', 'Toys Emporium');
SAVEPOINT StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20100,'2001/12/1','1000000011');
IF @@ERROR <>0 ROLLBACK TO StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20100, 1, 'BR01', 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20100, 2, 'BR03', 100, 10.99);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
COMMIT;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值