本节要点

事务简介
事务的四个特性
事务控制

事务简介

前面我们讲解的SQL语句,大多都是比较独立,也就是说,多个SQL语句之间没有逻辑联系。

那么,我们来看一下下面这种情况:

李一萱老师(老师编号:T0003)要准备退休了,接替她的是方杰萍老师(老师编号:T0020),现需要将李一萱老师教授的学生,全部转由方杰萍老师来教,并且需要同步删除李一萱老师的数据。

这里首先了删除老师表中李一萱老师的数据,而且同时要更新学生表中李一萱老师为方杰萍老师。

那么,我们可以写出下面这两个SQL:

DELETE FROM teacher WHERE teacher_id = 'T0003';
UPDATE student SET teacher_id = 'T0020' WHERE teacher_id = 'T0003';

正常情况下,这两个SQL一起执行成功,那老师表和学生表中的数据就都是有效数据。可如果在执行的时候,第一句DELETE执行成功了,但UDPATE没有执行成功,就会导致学生表中的李一萱在老师表中找不到,从而产生垃圾数据。

所以,这时候,就要求这两个语句要么全部执行成功,要么全部执行失败。

数据库提供了一种机制,能够去保证这一点。像上面的例子,即使DELETE语句执行成功,UPDATE语句如果执行失败,数据也会恢复成DELETE语句执行之前的情况。从而杜绝产生垃圾数据。

这个机制就是事务。它保证了要执行的一级操作,要么全部执行成功,要么全部执行不成功。只要是对表中数据有变动的操作,都可以使用事务来管理。比如UPDATE、DELETE、INSERT语句。

注意,在MySQL中,只有使用了InnoDB存储引擎的数据库或表才支持事务,也就是说MyISAM存储引擎是不支持的。

事务的四个特性

数据库中的事务具有如下四个特性,根据英文单词,也简称为ACID:

原子性(Atomicity):要执行的一组操作,要么全部执行成功,要么全部执行不成功。如果中间一个操作执行失败,则前面已经执行成功的语句也会被回退。
一致性(Consistency):事务开始前和执行后,并没有破坏数据的完整性。
隔离性(Isolation):多个事务之间是相互隔离的,不会相互影响。
持久性(Durability):事务执行结束后,数据就被永久保存在了数据库中,即使数据库出错、重启,数据也不会丢失。

事务控制

我们可以使用BEGIN关键字开始一个事务。在事务开始后,只要事务没有结束或没有被提交,所做的所有操作都不会反映到数据库里。

如果想取消之前的更新操作,也就是说想回滚当前事务,可以使用ROLLBACK关键字。

当然,如果想将之前的更新操作,正式提交到数据库中,可以使用关键字COMMIT。

关于事务详细操作的例子,大家可以查看我的视频教程进行学习。

picture loss