1. 事务概念
事务:英文单词Transaction,是由一个或多个SQL语句所组成的操作集合,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。
在数据库中,通过事务来保证数据的一致性。比如:下面两条SQL语句模拟银行账户转账,对每个账户分别涉及到金额更新的操作,这两条操作只允许全部成功或全部失败,否则就会出现数据错误的现象。
UPDATE account SET money = money - 500 where id=1;
UPDATE account SET money = money + 500 where id=2;
2. 事务组成
在数据库中,事务由:
一组相关的DML,加上:
若干DQL语句(SELECT),再加上
一个TCL语句(COMMIT、ROLLBACK)或
一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或
一个DCL语句(GRANT、REVOKE)组成。
例:如下SQL语句组成两个事务。
-
-
- INSERT….
- UPDATE….
- DELETE….
- SELECT….
- INSERT…
- COMMIT;-- 前6条语句,组成第1个事务
- UPDATE…
- DELETE….
- CREATE… ;--后3条语句,组成第2个事务
-
3. 事务控制
3.1 事务控制语言
事务控制语言,Transaction Control Language,简称TCL,主要用来对组成事务的DML语句的操作结果进行确认或取消。
确认:也叫提交,使组成该事务的所有DML语句操作生效,使用COMMIT关键字实现。
取消:也叫回滚,使组成该事务的所有DML语句操作不生效,使用ROLLBACK关键字实现。
所有SQL操作都涉及到事务控制,默认情况下,在MySQL数据库中,事务被设置成自动提交状态,每执行一条SQL执行后MySQL就帮我们自动提交事务,因此如果想要手动控制事务,就必须通过如下命令关闭MySQL的事务自动提交。
SET autocommit = 0; -- 0设置手动提交,1设置自动提交
这样就可以手动来控制事务是提交或者回滚了。在实际开发工作中,事务是一个非常重要的概念,一般情况下不会设置成自动提交。
也可以通过如下命令,来查看当前是否自动提交
SHOW VARIABLES LIKE 'autocommit';
注:引擎需要改成InnoDB,因为默认的引擎MyISAM不支持事务
3.2 事务结束方式
事务结束有两种状态,分别是提交和回滚。同时有两种方式控制事务的结束,一种是显示方式,一种是隐式方式,具体见下表。
事务结束方式 |
显示 |
隐式 |
提交 |
COMMIT; |
执行一个DDL或者DCL语句 |
回滚 |
ROLLBACK; |
发生异常情况,如断网断电等。 |
3.3 事务开启方式
事务开启也有两种方式,如下:
方式1:上一个事务结束后,遇到的第一条DML语句,事务自动开启。
例: ...
COMMIT; --事务显示提交,当前事务结束
SELECT .....;
INSERT INTO....; --上一个事务结束后,遇到的第一个DML,自动开启
UPDATE ....;
DELETE....;
SELECT ....;
INSERT ....;
CREATE; --事务隐式提交,当前事务结束;
UPDATE....; --上一个事务结束后,遇到的第一个DML,自动开启
DELETE ..;
ROLLBACK; --事务显示回滚,当前事务结束
方式2:通过BEGIN 或 START TRANSACTION 开启事务。
例:执行如下SQL语句,观察执行结果
BEGIN; --开启事务
INSERT INTO dept(deptno,dname,loc)
VALUES(18, 'dept1','loc1');
SELECT *
FROM dept;
--如上SQL执行完毕后,可以看到部门表中新插入一条编号为18的记录。
--继续执行如下SQL
ROLLBACK;
SELECT *
FROM dept;
4. 事务特征
事务的特征可用四个字母的缩写表示:即ACID
1)原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
2)一致性(Consistency)
一旦事务完成,不管是成功的,还是失败的,整个系统应处于数据一致的状态。
3)隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。
4)持久性(Durability)
也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。