一、事务的特性

在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。

使用事务可以大大提高数据安全性和执行效率,因为在执行多条SQL命令的过程中不必再使用LOCK命令锁定整个数据表,MySQL目前只支持InnoDB数据上的事务。

1. 原子性 

原子性是指整个数据库事务是不可分割的工作单位 。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。

2. 一致性

一致性是指事务将数据库从一种状态变成另一种一致的的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

3. 隔离性

隔离性要求每个读写事务的对象域其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,这通常使用锁来实现。

4.  持久性

事务一旦提交,其结果就是永久性的,即使发生死机等故障,数据库也能将数据恢复。

二、事务的分类

1.  扁平事务

2.  带有保存点的扁平事务

3.  链事务

4.  嵌套事务

5.  分布式事务

三、事务控制语句

1. 开启事务

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后会马上执行 COMMIT 操作。因此要显式地开启一个事务必须使用 START TRANSACTION 或 BEGIN WORK 语句,或者执行 SET AUTOCOMMIT=0 语句,以禁用当前会话的自动提交。

START TRANSACTION 的作用相当于 SQL Sever 数据库中的 BEGIN TRANSACTION 语句。该语句是本地事务的起始点,用于开始事务

2. 提交事务

如果要使用提交事务语句的最简单形式,只需发出 COMMIT 命令。COMMIT 更详细的写法是 COMMIT WORK, 这两者几乎是等价的。不同之处在于 COMMIT WORK用来控制事务结束后的行为是 CHAIN 还是 RELEASE。如果是 CHAIN 方式,那么事务就变成了链事务。用户可以通过参数 completion_type 来进行控制,参数的取值说明如下。

    (1) 如果 completion 参数值为0(默认值),表示没有任何操作。在这种设置下,COMMIT 和 COMMIT WORK 是完全等价的。

    (2) 如果 completion_type 参数值为1, COMMIT WORK 等同于 COMMIT AND CHAIN, 表示马上自动开启一个相同的隔离级别的事务。

    (3) 如果 completion_type 参数值为2, COMMIT WORK 等同于 COMMIT AND RELEASE,当事务提交后会自动断开与服务器的连接。

3. 回滚事务

ROLLBACK,回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。 (ROLLACK WORK)

4. 其他语句

    (1)SAVEOINT identifier。SAVEOINT 允许在事务中创建一个保存点,一个事务中可以有多个SAVEOPINT。

    (2)RELEASE SAVEOINT identitier。删除一个事务的保存点,当没有一个保存点执行 RELEASE SAVEOPINT identitier 语句时,会抛出一个异常。

    (3)ROLLBACK TO [SAVEPOINT] identitier。ROLLBACK TO [SAVEPOINT] identitier 语句与 SAVEOPINT 一起使用,可以把事务回滚到标记点,而不回滚在此标记点之前的任何工作。但是,如果回滚到一个不存在的保存点,会抛出异常。

    (4)SET TRANSACTION。SET TRANSACTION 语句用来设置事务的隔离级别。

5. 隐式提交的 SQL 语句

    (1) 数据定义语言

数据定义语言(DDL)是 SQL 集中负责数据结构定义与数据对象定义的语言,由 CREATE 、ALTER和DROP三个语句组成。

    (2) 隐式修改MySQL架构的操作语句

CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE和SET PASSWORD。

    (3) 管理语句

ANALYZE TABLE、CACHE INDEX、LOAD INDEX INTO CACHE、OPTIMIZE TABLE和REPAIR TABLE。

四、事务的隔离级别

1. READ UNCOMMITTED

设置 READ UNCOMMITTED (读取未提交内容)隔离级别,所有事务都可以看到其他未提交事务的执行结果。 READ UNCOMMITTED 隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被成为脏读(Dirty Read)。

2. READ COMITTED

READ COMITTED 是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NONREPEATABLE READ),因为同一事务的其他实例在该实例处理期间可能会有新的 COMMIT, 所以同一查询可能返回不同结果。

3. REPEATABLE READ

REPEATABLE READ (可重复读) 是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取事务数据时,会看到同样的数据行。

4. SERIALZABLE

SERIALZABLE 是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简单来说,它是在每个读的数据行上加上共享锁。在这个级别中,可能导致大量的超时现象和锁竞争。

5. 隔离级别发生的问题

实现4类隔离级别可能产生的问题

隔离级别

脏读可能性

不可重复读可能性

幻读可能性

加锁读

READ UNCOMMITTED





READ COMITTED





REPEATABLE READ





SERIALZABLE