事务
需要保证 原子性 、 隔离性 、 一致性 和 持久性 的一个或多个数据库操作称之为一个 事务
原子性
一致性
保证一致性的努力:
- 数据库本身能为我们保证一部分一致性需求。
- 更多的一致性需求需要靠写业务代码的程序员自己保证。
隔离性
持久性
数据从内存刷到磁盘
事务的状态
- 活动的(active)
事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。
- 部分提交的(partially committed)
当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在 部分提
交的 状态。
- 失败的(failed)
当事务处在 活动的 或者 部分提交的 状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续
执行,或者人为的停止当前事务的执行,我们就说该事务处在 失败的 状态。
- 中止的(aborted)
如果事务执行了半截而变为 失败的 状态,比如我们前边唠叨的狗哥向猫爷转账的事务,当狗哥账户的钱被扣除,但是猫爷账户的钱
没有增加时遇到了错误,从而当前事务处在了 失败的 状态,那么就需要把已经修改的狗哥账户余额调整为未转账之前的金额,换句
话说,就是要撤销失败事务对当前数据库造成的影响。书面一点的话,我们把这个撤销的过程称之为 回滚 。当 回滚 操作执行完毕
时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了 中止的 状态。
- 提交的(committed)
当一个处在 部分提交的 状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了 提交的 状态。
只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了
事务的语法
开启事务
1begin;
2或者
3start transaction;
提交事务
1coomit;
手动终止事务
1rollback;
2-- ROLLBACK 语句是我们程序员手动的去回滚事务时才去使用的,如果事务在执行过程中遇到了某些错误而无法继续执行的话,事务自身会自动的回滚。
支持事务的存储引擎
innoDB和NDB存储引擎。
自动提交
MySQL 中有一个系统变量 autocommit;
查询
1SHOW VARIABLES LIKE 'autocommit';
开启
1SET autocommit = ON;
关闭
1SET autocommit = OFF;
隐式提交
就算沒有显性执行commit,有一些操作也会悄悄地把提交给执行了。比如,执行DDL语言,重复执行开启事务的语句等等。
保存点
开启事务后,标记了保存点,如果发生回滚操作,不会一下回到事务开始之前的样子,而是可以指定回滚到某个保存点。
定义保存点的语法如下:
1SAVEPOINT 保存点名称;
当我们想回滚到某个保存点时,可以使用下边这个语句(下边语句中的单词 WORK 和 SAVEPOINT 是可有可无的):
1ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;
不过如果 ROLLBACK 语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。
刪除保存点
1RELEASE SAVEPOINT 保存点名称;