MySQL-脏读

事务在高并发执行的时候可能会发生脏读、不可重复读、幻读, 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

事务隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted)
不可重复读(read committed)
可重复读(repeatable read
串行化(serializable)
  • 未提交读(READUNCOMMITTED)另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)
  • 提交读(READCOMMITTED)本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)
  • 可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

MySQL中默认是可重复读(repeatable read)

查看当前session事务级别 show variables like '%tx_isolation%';

查看全局事务隔离级别 show global variables like '%tx_isolation%';

相关资料

MySQL 事务隔离实验-认识:脏读、不可重复读、幻读
MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL-锁

乐观锁、悲观锁、共享锁、排他锁、行锁、表锁、死锁

疑问难点

  • 什么是锁?
  • 为什么会出现锁情况?
  • 如果模拟锁情况?

基础知识

锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。

加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。

相关资料

MySQL-InnoDB-锁概念的理解
MySQL锁总结

mysql 死锁模拟测试
MySQL单表模拟锁和事务的几个场景