【SQL 事务】

SQL 事务

● 事务是需要在同一个处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理。
● 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种。
● DBMS的事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四种特性。通常将这四种特性的首字母结合起来,统称为ACID特性。

创建事务

  1. 事务开始语句

使用事务开始语句和事务结束语句,将一系列 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)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值