MySQL初级-16-事务

本文最后更新于:2020年7月27日 中午

mysql Ver 14.14 Distrib 5.5.62

16.1 含义

  1. 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。
  2. 整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事务开始以前的状态。
  3. 如果单元中的所有SQL语句均执行成功,则事务被顺利执行。

通过show engines;来查看mysql支持的存储引擎。

在mysql中用的最多的存储引擎有: innodb,myisam,memory 等。其中innodb支持事务,而myisam、memory等不支持事务。

16.2 特点

  1. 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么
    都发生,要么都不发生。

  2. 一致性(Consistency)

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  3. 隔离性(Ioslation)

    事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  4. 持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

16.3 事务的创建

以第一个DML语句的执行作为开始。

16.3.1 隐式事务

事务中没有明显的开启和结束的标记。

如:INSERT、UPDATE、DELETE语句

16.3.2 显式事务

事务有明显的开启和结束的标记。(前提:必须先设置自动提交功能为禁用。)

  1. 步骤1:开启事务

    SET autocommit=0;
    [START TRANSACTION;]
  2. 步骤2:编写事务中的SQL语句

    SELECT...
    INSERT...
    UPDATE...
    DELETE...
  3. 步骤3:结束事务

    COMMIT;				  #提交事务
    SAVEPOINT 节点名;		#设置保存点
    ROLLBACK [TO 保存点];	#回滚事务可指定回滚到保存点)

16.4 事务的结束

  1. COMMIT或ROLLBACK语句。
  2. DDL或DCL语句(自动提交)。
  3. 用户会话正常结束。
  4. 系统异常终止。

16.5 事务的并发问题

  1. 脏读

    脏读即为事务1第二次读取时,读到了事务2未提交的数据。若事务2回滚,则事务1第二次读取时,读到了脏数据。事务的脏读

  2. 不可重复读

    不可重复读与脏读逻辑类似。主要在于事务2在事务1第二次读取时,提交了数据。导致事务1前后两次读取的数据不一致。事务的不可重读读

  3. 幻读

    事务1第二次查询时,读到了事务2提交的数据。事务的幻读

不可重复读和幻读的区别:

不可重复读针对的是值的不同,幻读指的是数据条数的不同。

16.6 事务的隔离级别

一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

隔离级别描述
READ UNCOMMITTED
(读未提交的数据)
允许事务读取未被其他事务提交的变更数据。脏读、不可重复读和幻读的问题都会出现。
READ COMMITTED
(读已提交的数据)
只允许事务读取已被其他事务提交的变更数据。可以避免脏读,但不可重复读和幻读的问题仍可能出现。
REPEATABLE READ
(可重复度)
确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他的事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在。
SERIALIZABLE
(串行化)
确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有并发问题都可以避免,但性能很低。
  • MySQL支持 4 种事务隔离级别。MySQL默认的事务隔离级别为: REPEATABLE READ。
  • Oracle 支持的 2 种事务隔离级别: READ COMMITED,SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED。
隔离级别脏读不可重复读幻读
READ UNCOMMITTED
(读未提交的数据)
READ COMMITTED
(读已提交的数据)
×
REPEATABLE READ
(可重复度)
××
SERIALIZABLE
(串行化)
×××

查看当前的隔离级别:

SELECT @@tx_isolation;

设置当前的隔离级别:

SET TRANSACTION ISOLATION LEVEL [隔离级别];

设置数据库系统的全局的隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL [隔离级别];

版权声明:自由转载-非商用-非衍生-保持署名 Creative Commons BY-NC-ND 3.0 协议,转载请注明出处!

 目录