SQL 事务1
1. 定义
编程之家解释: 事务
(Transaction)是中的核心概念,指的是将的一组操作作为整体,要么全部执行,要么都不执行。
2. 前言
本小节,我们将一起学习中的重点——事务
。
事务并非 中独有,在、编程语言、各类框架中均有出现,而且无一例外都是重点
。事务是较为复杂的概念,本小节会有一定的理论阐述,当然也会有一些小例子来帮助你理解。
事务的比较多,本小节会介绍事务的概念和基本使用,下一小节我们再来探讨事务的四种隔离级别。
本小节测试数据如下,请先在中执行,本小节的所有操作若无特殊说明认在 中执行。
DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(), age int);INSERT INTO imooc_user(id,username,age)VALUES (,'peter',),(,'pedro',),(,'jerry',),(,'mike',),(,'tom',);
3. 理论
事务具有四大特性,即ACID
,它们分别是:
原子性(Atomicity):每个事务都是整体,不可再拆分,事务中的 操作要么全部执行成功,要么全部失败。
一致性(Consistency):事务执行前后的状态必须保持一致。如 A 转账给 B,转账后金额的总数是不变的。
隔离性(Isolation):事务与事务之间互不影响,彼此隔离。
持久性(Durability):事务一旦提交成功,对的更改就是永久的,即使出现了其它情况,数据改变仍然存在。
事务的四大特性是事务最本质的特点,四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。
事务是一组操作的集合,因此没有固定的语法格式,事务常见的控制语句如下:
START TRANSACTION
或BEGIN
,用来显式地开始事务。
COMMIT
,提交事务。
SAVEPOINT
,创建保存点,事务可以有多个保存点,事务可以根据保存点进行回滚。
ROLLBACK
或ROLLBACK TO [SAVEPOINT]
,回滚事务,认回滚所有更改,如果保存点,则回滚到保存点。
RELEASE SAVEPOINT
,释放保存点,即某个保存点,保存点被后,不可回滚。
SET TRANSACTION
,设置事务的隔离级别,在下小节将会详细介绍。
: 并不是每个引擎都事务,如 的 MyISAM 引擎就事务。
4. 实践
的一般流程为:通过 BEGIN 开始事务,进行一组数据操作,如果操作成功,通过 COMMIT 提交事务,否则通过 ROLLBACK 回滚。
请书写 语句,通过事务向imooc_user
表插入,为lucy
,年龄为21
,并提交事务。
分析:
先通过 BEGIN 开始事务,然后使用 INSERT 语句插入,再通过 COMMIT 提交事务即可。
语句:
整理可得语句如下:
BEGIN;INSERT INTO imooc_user(id,username,age) VALUES (,'lucy',);COMMIT;
执行成功后,结果如下:
+----+----------+-----+ | id | username | age | +----+----------+-----+ | 6 | lucy | 21 | +----+----------+-----+
事务提交和事务回滚是一对互斥操作,事务回滚后,事务之前的操作都将失效
。
请书写 语句,通过事务向imooc_user
表插入,为dell
,年龄为21
,并回滚事务。
分析:
先通过 BEGIN 开始事务,然后使用 INSERT 语句插入,再通过 ROLLBACK 回滚事务即可。
语句:
整理可得语句如下:
BEGIN;INSERT INTO imooc_user(id,username,age) VALUES (,'dell',);ROLLBACK;
执行成功后,dell 并未被插入到 imooc_user 表中,可见 ROLLBACK 的确撤销了之前的数据操作。
前面谈到,事务的回滚是可以指定保存点的,因此我们可以只回滚部分操作,提交其它操作。
如下:
BEGIN;INSERT INTO imooc_user(id,username,age) VALUES (,'stark', );SAVEPOINT savepoint1;INSERT INTO imooc_user(id,username,age) VALUES (,'alice', );ROLLBACK TO savepoint1;COMMIT;
上面的 语句的大致执行流程如下:
BEGIN 的开启了事务。
向 imooc_user 表中插入了 stark ,并且通过 SAVEPOINT 新建了保存点 savepoint1。
又向 imooc_user 中插入了另外 alice。
通过 ROLLBACK 将事务回滚到了 savepoint1,即第2个插入语句将会失效。
提交事务。
执行成功后,数据如下:
+----+----------+-----+ | id | username | age | +----+----------+-----+ | 8 | stark | 20 | +----+----------+-----+
从结果中可以得出,alice 并没有插入成功,这与我们的分析一致,也验证了事务的强大。
5. 小结
事务是的重点,也是很多框架的重点,是支撑并发的基石,因此请务必多多练习
事务的使用。
事务的四大特性虽然较多,但历来都是面试的重点,请务必理解并且熟稔于心。