mysql myisam 默认隔离级别_MyISAM、InnoDB 数据锁、事务隔离级别

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

MyISAM默认用的是表级锁,不支持行级锁

lock tables table_name read | write; myisam加锁

unlock tables;

select * from table_name for update;读锁上排它锁

InnoDB默认用的是行级锁,也支持表级锁

show variables like 'autocommit';  set autocommit = 0; #关闭自动提交

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;#查看事务的隔离级别

cc628a7c9d3c495dd7c98a4f95e7d79e.png

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

数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段

undo日志

read view

de669ee9c072557f06e6d9aec252a73b.png

next-key锁(行锁+gap锁)

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

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

如果where条件部分命中或全不命中,则会加Gap锁

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

8afc8d8891c6ff2fb487eef7a351aef3.png

bc71bc9a0a201911b37d0aeac1653e73.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值