MySQL中的AICD
原子性
隔离性
一致性
持久性
事务的概念
MySQL事务的语法
开启事务
提交事务
手动终止事务
支持事务的存储引擎
自动提交
隐式提交
保存点
MySQL事务
MySQL中的AICD
原子性
一个不可分割的操作被称为原子,但是这个操作可能是由多种操作组成。这也是事务着重要处理的问题
隔离性
不同操作之间应该互不影响
一致性
数据符合约束条件,在MySQL中可以通过触发器来实现一致性需求或者程序员自己编写业务代码来实现
持久性
在一个操作完成之后,这个操作的结果将被永久的保存
事务的概念
数据库中,将需要保证ACID的一个或者多个数据库操作称之为一个事务。事务实际上是一个抽象的概念,按照执行的时机不同,事务大致上划分成以下几种状态:
活动的(active) 事务对应的数据库操作正在执行过程中 部分提交(partially committed) 当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘,该事务处在部分提交状态 失败的(failed) 当事务处在活动中或者部分提交的状态时,可能遇到了某些错误而无法继续执行,或者人为地停止当前事务执行,就说该事务处在失败的状态。 中止的(abort) 将数据库恢复到执行事务之前的状态,也称为回滚 提交的(committed) 当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上后,就说该事务处在了提交的状态。
只有当事务处在提交的或者中止的状态,一个事务的生命周期才算是结束。
MySQL事务的语法
下面接着学习MySQL是怎么完成一个事务的
开启事务
可以选择下面两种语句之一来开启一个事务:
BEGIN [work];
开启一个事务,后面就可以写若干执行事务的语句START TRANSACTION;
与BEGIN相同,这个语句也标志着开启一个事务。但是其后面可以跟着若干个修饰符如果想只开启一个只读事务,可以写
START TRANSACTION READ ONLY
,如果想跟随多个修饰符用逗号隔开READ ONLY
:标识当前事务是一个只读事务,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。READ WRITE
:标识当前事务是一个读写事务,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据WITH CONSISTENT SNAPSHOT
:启动一致性读
提交事务
完成事务中的语句后,就可以通过commit
指令提交事务
commit [work]
手动终止事务
ROLLBACK [work]
支持事务的存储引擎
MySQL并不是所有存储引擎都支持事务的,目前只有InnoDB和NDB存储引擎支持事务。
自动提交
MySQL中有一个系统变量autocommit
在默认情况下是开启的,即时不手动开启一个事务,在MySQL中每一条语句看作是一个独立的事务,在每一条语句完成之后,都会自动提交。
如果将系统变量autocommit
设置为OFF。这样写入的多条语句就算是属于同一个事务了,直接通过显式的写出COMMIT
语句把这个事务提交掉,或者显式的写出ROLLBACK
语句来把这个事务回滚掉。
隐式提交
当我们使用START TRANSACTION
或者BEGIN
语句开启了一个事务,或者系统变量autocommit
设置为OFF后,事务就不会进行自动提交,但是如果遇到一些特殊的语句就会导致事务隐式提交。这些语句包括:
数据定义语言 DDL
:指数据库、表、视图、存储过程等的定义。隐式使用或修改 mysql数据库
中的表事务控制或关于锁定的语句:例如一个事务还未完成就遇到了另一个事务,上个事务会先隐式提交。 加载数据的语句:使用 LOAD DATA
语句来批量往数据库中导入数据时,也会隐式提交前面语句所属的事务。关于MySQL复制的一些语句
保存点
如果开启了一个事务,在事务执行过程中可以设置保存点,这样使用ROLLBACK
语句可以回到保存点而不是事务开始时期。
定义保存点的语法如下:
SAVEPOINT 保存点名称;
当我们想回到某个保存点时,可以使用下面的语句:
ROLLBACK [WORK] TO [SAVEPOINT]
如果想要删除保存点,可以使用下面的语句:
RELEASE SAVEPOINT 保存点名称




