MySQL锁模块MyISAM与InooDB关于锁方面的区别

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 关键字的实现也是悲观锁。

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

实现:

  1. 先读取test_innodb的数据,得到Version的值为versionValue
    select version from test_innodb where id = 2; //0
  2. 每次更新test_innodb表中的money字段的时候,为了防止冲突,先去检查version再做更新,更新成功的话version + 1
  3. 假设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版权协议,转载请附上原文出处链接和本声明。