MySQL锁机制

数据库锁机制,简单来说就是数据库为了保证数据的一致性,使各种共享资源在被并发访问时变得有序而设计的一种规则。 MySQL锁机制最显著的特点是不同的存储引擎支持不同的锁机制。InnoDB支持行锁,有时也会升级为表锁,MyISAM只支持表锁。

  • 表锁的特点是开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度相对较低。
  • 行锁的特点是开销大,加锁慢;会出现死锁;锁粒度小,发生锁冲突的概率较低,并发度相对表锁较高。

InnoDB的行锁类型主要有读锁(共享锁)、写锁(排它锁)、意向锁和MDL(元数据锁)。

  • 读锁,简称S锁,一个事物获取了一个数据行的读锁,其他事务能获取该行数据对应的读锁但不能获得写锁,即一个事务在读取一个数据行时,其他事务也可以读但不能对该数据行进行增删改操作。读锁有两种select方式的应用,,第一种是自动提交模式下的select查询语句,不需要加任何锁,直接返回查询结果,这就是非锁定一致性读。第二种是通过select...lock in share mode 在被读取到行记录或者记录范围上加上一个读锁,让其他事务可以读,但是想要申请写锁那就会被阻塞。
  • 写锁,简称X锁,一个事物获取了一个数据行的写锁,其他事务就不能在获得改行的其他锁,写锁的优先级最高。一些DML语句都会对行记录加上写锁,比较特殊的是select..for update 它会对读取的行记录上加一个写锁,那么其他任何事物就不能在被锁定的行上加任和锁了,不然会被阻塞。
  • 意向锁,在MySQL的InnoDB存储引擎中,意向锁是表级锁。而且有两种意向锁类型,分别是意向共享锁(IS)和意向排它锁(IX)。意向共享锁是指在给一个数据行加共享锁前必须先去的该表的IS锁;意向排它锁(IX)是指在给一个数据行加排它锁前必须先获得该表的IX锁。。意向锁的作用和MDL想死,都是防止在事务过程中,执行DDL语句操作而导致的数据不一致。
  • MDL(元数据锁),meta data lock 是MySQL在5.5引入的,简称MDL锁,用于保证表中元数据的信息。在会话A中,表开启了查询事务后,会自动获得一个MDL锁,会话B就不能任何的DDL语句的操作。


InnoDB默认的事务隔离级别为RR,并且参数innodb_unsafe_for_binlog = 0的模式下,行锁种类有三种。

  • 单个行记录的锁(record lock)。主键索引和唯一锁引都是行记录的锁模式、。在RC的隔离级别下,只有record lock记录锁模式。InnoDB的行锁是加在索引上的。
  • 间隙锁(GAP Lock)。间隙锁只锁定行记录数据的范围,不包含记录本身,即不允许在此范围内插入任何数据。另,间隙锁只针对RR隔离级别起作用,它是用来防止幻读现象的。
  • 记录锁和间隙锁的组合叫做next-key lock。普通索引默认的就是next-key lock模式。当InnoDB扫描索引记录时,会先对选中的索引记录加上记录锁(Record lock),再对索引记录两边的间隙加上间隙锁(Gap lock)。next-key lock会锁住范围本身的值,是闭区间。

转载于:https://www.cnblogs.com/fkqm/p/11540499.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值