文章目录
11.1 数据库事务概述
- 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持
一致性
,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。 - 在MySQL中,只有InnoDB是支持事务的
11.1.1 事务的基本概念
- 事务一组逻辑操作单元,使数据从—种状态变换到另一种状态。
11.1.2 事务的处理原则
- 保证所有事务都作为一个
工作单元
来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交
(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚
( rollback )到最初状态。
11.1.3 事务的ACID属性
-
原子性(atomicity):原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。
- 原子性的体现之一是在转账案例中,要么转账成功,要么转账失败,是不存在中间的状态。
- 如果无法保证原子性会怎么样?就会出现数据不一致的情形,A账户减去100元,而B账户增加100元操作失败,系统将无故丢失100元。
-
一致性(consistency):一致性是指事务执行前后,数据从一个
合法性状态
变换到另外一个合法性状态。- 这种状态是
语义
上的而不是语法上的,跟具体的业务有关。 - 那
什么是合法的数据状态
呢?满足预定的约束
的状态就叫做合法的状态。通俗一点,这状态是由你自己来定义
的(比如满足现实世界中的约束)。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!如果事务中的某个操作失败了,系统就会自动撤销当前正在执行的事务,返回到事务操作之前的状态。
- 这种状态是
-
隔离性(isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
-
持久性(durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
- 持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候,
首先会将数据库的变化信息记录到重做日志中
,然后再对数据库中对应的行进行修改
。 - 这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。
- 持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候,
总结
ACID是事务的四大特性,在这四个特性中,原子性是基础
,隔离性是手段
,一致性是约束条件
,而持久性是我们的目的
。
数据库事务,其实就是数据库设计者为了方便起见,把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务。
11.1.4 事务的状态
-
我们现在知道事务是一个抽象的概念,它其实对应着一个或多个数据库操作,MySQL根据这些操作所执行的不同阶段把事务大致划分成几个状态:
活动的
(active):事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态。部分提交的
(partially committed):当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。失败的
(failed):当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状念。中止的
(aborted):如果事务执行了一部分而变为失败的状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状态。换句话说,就是要撤销失败事务对当前数据库造成的影响。我们把这个撤销的过程称之为回滚。当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态。提交的
(committed):当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态。
-
事务的状态转换图如下所示:
-
图中可见,只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,对于处于中止状态的事务,该事务对数据库所做的所有修改都会被回滚到没执行该事务之前的状态。
11.2 显式事务和隐式事务
11.2.1 显式事务
-
步骤一:START TRANSACTION或者BEGIN,作用是显式开启一个事务。
mysql>BEGIN; #或者 mysql> START TRANSACTION;
-
START TRANSACTION相较于BEGIN的特别之处在于,后面能跟几个修饰符:
- READ ONLY:标识当前事务是一个
只读事务
,即属于该事务的数据库只能进行读取操作,不能进行修改操作。(不能对其他事务能访问到的表
进行修改,对临时表
可以进行修改) - READ WRITE:标识当前事务是一个读写事务,即属于该事务的数据库既可以进行读取操作,也可以进行修改操作。
- WITH CONSISTENT SNAPSHOT:启动一致性读。
#开启一个只读事务 START TRANSACTION READ ONLY; #开启只读事务和一致性读 START TRANSACTION READ ONLY,WITH CONSISTENT SNAPSHOT;
- READ ONLY:标识当前事务是一个
-
READ ONLY和READ WRITE是用来设置所谓的事务访问模式的。一个事务的访问模式不能同时既设置为只读的也设置为读写的。
-
如果我们不显式指定事务的访问模式,那么该事务的
默认访问模式是读写模式
。
-
-
步骤二:一些列事务中的操作,主要是DML,不包含DDL
-
步骤三:提交事务 或者 终止事务(回滚事务)