MySQL事务操作

1.手动提交事务

  • 执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 提交事务

  • 执行失败的情况: 开启事务 -> 执行多条 SQL 语句 -> 回滚事务

指令 说明
start transaction;/begin; 开启事务
commit; 提交事务
rollback; 回滚事务

2.自动提交事务

  • MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句 执行完毕 自动提交事务

  • MySQL默认是自动提交事务

  • 查看当前事务是否开启

    1. show variables like 'autocommit';
  • 关闭自动开启事务
    1. SET @@autocommit=off;

事务的特性

  • 原子性:事务中所有的语句要么都执行成功,要么都失败
  • 一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致
  • 隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态
  • 持久性:一旦事务执行成功,对数据库的修改是持久的

MySQL事务隔离级别

1.并发问题

  • 脏读:一个事务读取到了另一个事务中尚未提交的数据
  • 不可重复读:一个事务中两次读取的数据内容不一致
  • 幻读:一个事务所获得的数据不准确,无法支撑后续操作

2.四种隔离级别

修饰符 名称 隔离级别 脏读 不可重复读 幻读 默认隔离级别
1 读未提交 read uncommitted 7.MySQL事务 - 图1 7.MySQL事务 - 图2 7.MySQL事务 - 图3
2 读已提交 read committed 7.MySQL事务 - 图4 7.MySQL事务 - 图5 Oracle和SQLServer
3 可重复读 repeatable read 7.MySQL事务 - 图6 MySQL
4 串行化 serializable

3.相关命令

  • 设置当前隔离级别
    1. /*
    2. set global transaction isolation level 级别名称;
    3. read uncommitted 读未提交
    4. read committed 读已提交
    5. repeatable read 可重复读
    6. serializable 串行化
    7. */
    8. set global transaction isolation level read uncommitted;
  • MySQL5.7:查看当前隔离级别
    1. select @@tx_isolation;
  • MySQL8.0+:查看当前会话隔离级别
    1. select @@transaction_isolation;
  • MySQL8.0+:查看系统当前隔离级别
    1. select @@global.transaction_isolation;

更新时间:{docsify-updated}