数据库锁和隔离

本文详细解析了MySQL中InnoDB和MyISAM存储引擎的锁机制差异,包括行级锁与表级锁的工作原理,共享锁与排他锁的作用,以及一致性非锁定读、显式锁定读的实现方式。同时,介绍了事务隔离级别的概念及其对数据读取的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Myisam支持的是表级锁,Innodb支持的是行级锁
2.lock latch
在数据库中,这2个都叫做锁,然而却有着截然不同的含义
在这里插入图片描述
3.在innodb中有2种行级锁
共享锁:允许事务读一行数据
排他锁:允许事务删除或更新一行数据
很容易理解,当一行数据被排它锁锁住时,是不允许其他任何事务再去获取这行数据的任务锁的
然而当一行数据被共享锁锁住时,是允许其他事务再去获取这行数据的共享锁的,因为读不会修改中这行的数据,这称为锁兼 容。

4.一致性非锁定读:就是当读取的行正在进行update或者delete操作时,此时读操作不会等着行锁的释放,而是去获取快照数据,快照数据是undo段实现的。然而读取的版本快照数据因隔离方式的不同而不同。
读已提交:读取的是最新版本的快照数据
可重复读:读取的是事务开始时的快照版本数据

5.支持显式的一致性锁定读
select … for update; 在该行获取一个排他锁
select … lock in shard mode; 在该行获取一个共享锁
当事务提交或回滚后,该锁也就被释放了

6.我们都知道 事务遵循ACID,也就是原子性,一致性,隔离性,持久性

隔离机制:
读未提交:会产生脏读
读已提交:解决了脏读,会出现不可重复读,是oracle的默认隔离方式
可重复读:innodb默认的隔离方式,使用Next_Key Lcok的方式避免了不可重复读的现象,在Next_Key Lcok算法下,对于索引的扫描,不仅是锁住扫描到的索引,而且还锁住这些索引覆盖的范围,因此在这个范围的插入更新都是不允许的,这样就避免了另外的事务在这个范围内插入更新数据导致的不可重复读的问题。
串行读: 不用多说,效率很低

所谓脏读:事务A可以读到事务B未提交的数据,跟脏页是不一样的,脏页是在缓冲池中被修改的页,即使还没有被刷到磁盘中,日志已经写到了undo日志中,只是因为内存和磁盘的异步造成的,是最终一致性。
所谓不可重复读:事务A第一次读到数据后,事务B修改了该行数据,事务A再次读取该行数据,发现与第一次读取到的数据不一样,违反了事务的隔离性。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值