MySQL事务

149 阅读5分钟

1.基本介绍

事务用于保证数据的一致性,有一组相关的DML语句组成(一组操作单元) ,该组语句要么全部成功,要么全部失败。

在 MySQL 中,只有InnoDB是支持事务的。

2.事务的ACID特性

  • 原子性(Atomicity)——基础:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  • 一致性(Consistency)——约束条件:事务必须使数据库从一个一致性状态变换到另一个一致性状态(事务是一个整体,提交后才能变为另一个状态);在事务的生命周期中数据的一致性

  • 隔离性(Isolation)——手段:多个用户并发访问数据库时,数据库为每一个用户开启的事务,一个事务内部的操作以及使用的数据不能被其他并发事务的操作数据所干扰,多个并发事务之间要相互隔离
  • 持久性(Duriability)——目的:一个事务一旦被提交,对数据库中数据的改变是永久性的,数据同步到磁盘

3.事务的状态

  • 活动的(active) :事务对应的数据库操作正在执行的过程中
  • 部分提交的(partially committed) :事务的所有操作执行完成,但由于操作都在内存中执行,所造成的影响还没有刷新到磁盘前的状态
  • 提交的(committed) :当一个处在部分提交的状态的事务将数据都同步到磁盘后的状态
  • 失败的(failed) :当事务处在活动的或部分提交的状态时,可能遇到某些错误或者人为的停止当前事务的执行
  • 中止的(aborted) :当事务变为失败的状态,需要进行回滚,回滚操作执行完毕后数据恢复到执行事务之前的状态,就是中止的状态

只有事务处于提交的状态或者中止的状态,事务的生命周期才算结束;已提交的事务操作全部执行成功,中止的事务操作全部执行失败

4.事务和锁

当执行事务操作时,mysql会在表上加上锁,防止其他用户修改表的数据

5.使用事务

5.1.显式事务

  • 使用TRANSACTIONBEGIN显式开启事务,区别在于TRANSACTION可以后面可以加修饰符

    • READ ONLY:只读事务,只能读取数据,不能修改数据

    可以修改通过CREATE TEMPORARY TABLE创建的临时表

    • READ WRITE:读写事务,既可以读取数据,也可以修改数据
    • WITH CONSISTENT SNAPSHOT:一致性读
    • 如果不指定访问模式,默认为READ WRITE
  • SAVEPOINT的使用

    • 创建保存点:SAVEPOINT 保存点名称;
    • 回滚到某个保存点:ROLLBACK TO 保存点名称;
    • 删除保存点:RELEASE SAVEPOINT 保存点名称;

5.2.隐式事务

  • 关键字:AUTOCOMMIT

每条DML语句都是独立的事务,受AUTOCOMMIT的控制会自动提交。

  • 关闭自动提交

    • 方式一:SET AUTOCOMMIT FALSE;

      仅针对DML操作有效

    • 方式二:在AUTOCOMMITON的情况下,使用显示的方式开启事务,DML操作就不会自动提交

6.隐式提交数据(不受AUTOCOMMIT影响)

在这些语句执行完后,有一个隐式的COMMIT操作

6.1.数据定义语言(DDL)

当使用数据定义语言CREATE,ALTER,DROP等去修改数据库对象时,就会隐式提交前面语句所属的事务。

6.2.用来隐式地修改mysql架构

CREATE USER, DROP USER, GRANT, RENAME USER,REVOKE, SET PASSWORD

6.3.事务控制语句

  • 在上一个事务还没提交时,又使用SART TRANSACTIONBEGIN开启了另一个事务,会隐式提交上一个事务

  • 当前AUTOCOMMIT的值为OFF,手动把它改为ON时,会隐式提交前面语句所属的事务

7.事务隔离级别

7.1.介绍

  • 事务隔离:多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
  • 事务隔离级别:事务与事务之间的隔离程度

7.2.数据并发问题

  • 脏写:事务A修改了另一个未提交事务B修改过的数据,发生脏写
  • 脏读:当一个事务读取另一个事务尚未提交的操作时,如果事务B回滚,事务A读取的数据就是临时且无效的,产生脏读
  • 不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
  • 幻读:同一查询在同一事务中多次进行,由于其他事务的插入操作,每次返回不同的结果集,产生幻读

7.3.4种隔离级别

隔离级别脏读不可重复读幻读加锁读
读未提交(read uncommitted)不加锁
读已提交(read committed)×不加锁
可重复读(repeatable read)×××不加锁
可串行化(serializable)×××加锁
  • 查看当前会话隔离级别: select ``@@tx_isolation;

  • 查看系统当前隔离级别: select ``@@global.tx_isolation;

  • 设置当前会话隔离级别:set session transaction isolation level 隔离级别

  • 设置系统当前隔离级别:set global transaction isolation level 隔离级别

  • MySQL默认的事务隔离级别是:repeatable read