《MySQL系列》事务笔记

170 阅读2分钟

一、事务模型

  • 自动事务:在事务中,事务自动提交,发生错误时自动回滚。系统自动默认
  • 隐式事务:每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的标记。需要commit、rollback语句提交或回滚当前事务
  • 显式事务:每个事务都有显式的开始和结束标记。当使用starttransaction、commit时发生显示事务

二、数据库的四种隔离级别

  • read uncommitted 脏读,可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。
  • read committed 幻读,读取其它事务提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。
  • repeatable read 默认级别 幻读,可以重复读取。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。
  • serializable 可串行化 可读,不可写。像java中的锁,写数据必须等待另一个事务结束。

三、事务命令

  • 查看当前会话隔离级别:select @@tx_isolation;
  • 查看系统当前隔离级别:select @@global.tx_isolation;
  • 设置当前会话隔离级别:set session transaction isolation level [read uncommitted | read committed | repeatable read | serializable];
  • 设置系统当前隔离级别:set global transaction isolation level repeatable read;
  • 开启事务:set autocommit=off 或者 start transaction;
  • 提交事务:commit
  • 回滚事务:rollback

四、实际使用(todo)

1)如果一个事务对id=1的数据做了修改(或者是整张表)

  • 当前隔离级别是serializable,则其它事务不能查id=1的数据,但是可以查id=2的数据,不管是改id=1还是id=2必须等待;
  • 当前隔离级别不是serializable,则其它事务能查不能改id=1的数据(会等待),但是可以改id=2的数据 2)如果一个事务查询id=1的数据(或者是整张表)
  • 当前隔离级别是serializable,则其它事务能查询、不能改id=1的数据;
  • 当前隔离级别不是serializable,则其它事务可以查、改id=1的数据;