MyISAM、InnoDB 数据锁、事务隔离级别

MyISAM与InnoDB关于锁方面的区别是什么

  • MyISAM默认用的是表级锁,不支持行级锁
  1. lock tables table_name read | write; myisam加锁
  2. unlock tables;
  3. select * from table_name for update;读锁上排它锁
  • InnoDB默认用的是行级锁,也支持表级锁
  1. show variables like 'autocommit';  set autocommit = 0; #关闭自动提交
  2. select * from table_name where id = ? lock in share mode; 为查询语句加锁

MyISAM使用场景

  • 频繁执行全表count语句
  • 对数据进行增删改的频率不高,查询非常频繁
  • 没有事务

InnoDB适合的场景

  • 数据增删改查都相当频繁
  • 可靠性要求比较高,要求支持事务

数据库锁的分类

  • 按锁的粒度划分,可分为表级锁、行级锁、页级锁
  • 按锁级别划分,可分为共享锁、排它锁
  • 按加锁方式划分、可分为自动锁、显式锁
  • 按操作划分,可分为DML锁,DDL锁
  • 按使用方式划分,乐观锁,悲观锁

数据事务的四大特性

ACID

  • 原子性(Atomic)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务并发访问引起的问题以及如何避免

  • 更新丢失--mysql所有事务隔离级别在数据库层面均可避免
  • 脏读--READ-COMMITTED事务隔离级别以上可以避免
  • 不可重复读--REPEATABLE-READ事务隔离级别以上可避免
  • 幻读--SERIALIZABLE事务隔离级别可避免(事务A读取与搜索条件匹配的若干行,事务B以插入或删除行的方式修改事务A的结果集,导致事务A像出现幻觉一样)

InnoDB可重复读隔离级别下如何避免幻读

  • 表象:快照读(非阻塞读)--伪MVCC
  • 内在:next-key锁(行锁+gap锁)

当前读和快照读

  • 当前读:select ... lock in share mode, select ... for update
  • 当前读:update, delete, insert(读取记录的最新版本,还要求其他事务不能修改当前记录)
  • 快照读:不加锁的非阻塞读,select

show variables like 'autocommit';#查看当前事务是否是自定提交

SET autocommit = 0;#关闭自动提交

select @@tx_isolation;#查看事务的隔离级别

 RC、RR级别下的InnoDB的非阻塞读如何实现

  • 数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
  • undo日志
  • read view

next-key锁(行锁+gap锁)

对主键索引或唯一索引会用Gap锁吗

  •  如果where条件全部命中,则不会用Gap锁,只会加记录锁
  • 如果where条件部分命中或全不命中,则会加Gap锁

Gap锁会用在非唯一索引或者不走索引的当前读中

原文地址:https://www.cnblogs.com/2661314cn/p/13557287.html