MyISAM与InooDB关于锁方面的区别是什么?
- MyISAM默认用的是表级锁,不支持行级锁
当表进行查询的时候,MyISAM会自动给表上个表级的读锁,会block其他session对其数据的更新;
而进行增删改的时候MyISAM会给表上个表级的写锁。
当读锁未被释放,另外一个session想对这张表加上写锁就会被阻塞,直到所有的读锁都被释放为止。
lock tables person_info_myisam read; //读锁(共享锁)
unlock table //释放
lock tables person_info_myisam write;//写锁(排它锁)
若表先上了共享锁之后,依然支持上共享锁,不支持上排它锁
若表先上了排它锁,那么另外的读或者写都是不允许的
- InnoDB默认用的是行级锁,也支持表级锁 (走索引是上行级锁,不走索引则是表级锁)
锁的粒度越细代价则越高,相比表级锁在表的头部直接加锁来讲,行级锁还要扫描到某行的时候对齐上锁,这样代价是比较大的。
InnoDB支持事务的同时也相比MyISAM带来了更大的开销。
MyISAM适合的场景
- 频繁执行全表count语句
- 对数据进行增删改的评率不高,查询非常频繁
- 没有事务
InnoDB适合的场景
- 数据增删改查都相当频繁
- 可靠性要求比较高,要求支持事务
数据库锁的分类
- 按锁的粒度划分,可分为表级锁、行级锁、页级锁
- 按锁级别划分,可分为共享锁、排它锁
- 按加锁方式划分,可分为自动锁、显示锁
- 按操作划分,可分为DML锁、DDL锁
- 按使用方式划分,可分为乐观锁、悲观锁
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如 Java 里面的同步原语 synchronized 关键字的实现也是悲观锁。
乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
实现:
- 先读取test_innodb的数据,得到Version的值为versionValue
select version from test_innodb where id = 2; //0 - 每次更新test_innodb表中的money字段的时候,为了防止冲突,先去检查version再做更新,更新成功的话version + 1
- 假设session 2 已经对这个数据做了update操作 version = 1
所以
update test_innodb
set money = 123,version = 0 + 1
where version = 0 and id = 2 //发现ver版本变动,执行失败
版权声明:本文为qq_42931883原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。