← 返回首页
MySQL基础教程(二十)
发表时间:2020-03-19 01:00:36
讲解MySQL的事务

1.什么是事务

事务:事务(Transaction),一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元),完成一个业务逻辑需要若干个步骤,这些步骤要么都成功,要么都失败。

2.事务的四大特征

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 - 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 - 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 - 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 - 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3.MySQL中使用事务

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。 我们可以使用select @@autocommit; 来查看当前数据库是否是自动提交事务。要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交

实例:

假设有以下学生表(students)的测试数据。

我们分别用两种方式来使用事务去尝试删除一条记录。

#开启一个事务
begin;
delete from students where sid = 5;
#回滚
rollback;
#提交
commit;

select * from students;

我们发现编号为5的学生记录并没有被删除,说明事务起作用了。

第二种方式。

#设置为非自动提交
SET AUTOCOMMIT=0;
delete from students where sid = 5;
#回滚
rollback;
#提交
commit;
#设置为自动提交
SET AUTOCOMMIT=1;

select * from students;

我们发现编号为5的学生记录并没有被删除,说明事务起作用了。

4.设置保存点

ROLLBACK 回滚的用法可以设置保留点 SAVEPOINT,执行多条操作时,回滚到想要的那条语句之前。

例如:

SET AUTOCOMMIT=0;

insert into students (sname,gender) values ('翠花','女');
#设置回滚点
SAVEPOINT mypoint;
delete from students where sid = 5;
#回滚到指定的SQL语句
rollback to mypoint;
#提交
commit;
SET AUTOCOMMIT=1;
select * from students;

回滚到insert语句之后,所以即便回滚也不影响'翠花'这条记录的插入。