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