被广泛了解却鲜有人知的8个浏览器API
|
的形式触发
GAP锁的目的,是为了防止事务插入而导致幻读的情况。该锁只会在隔离级别是RR或者以上的级别内存在。间隙锁的目的是为了让其他事务无法在间隙中新增数据。 SQL里面用 where >、>=等范围条件触发,但会根据锁定的范围内,是否包含了表中真实存在的记录进行变化,如果存在真实记录就会进化为 临建锁。反之就为间隙所。
面试官: 那这个东西是怎么实现的? t(id PK, name KEY, sex, flag);
表中有四条记录: 被加锁资源是可被共享的,但仅限于读请求。它的写请求只能被获取到锁的请求独占。 也就是加了共享锁的数据,只能够当前线程修改,其它线程只能读数据,并不能修改。 吒吒辉: 在 SQL 请求上可分为读、写锁。但本质还是对应对共享锁和排它锁。 面试官: 那 SQL 请求上不加锁怎么访问? 为啥说它们属于共享锁和排他锁? 这之间有何联系? 吒吒辉: 除加锁读外,还有一种不加锁读的情况。这种方式称为快照读,读请求加锁称为共享读。 针对请求加共享、排它锁的原因在于,读请求天生是幂等性的,不论你读多少次数据不会发生变化,所以给读请求加上锁就应该为共享锁。 不然怎么保证它的特点呢? 而写请求,本身就需对数据进行修改,所以就需要排它锁来保证数据修改的一致性。 吒吒辉: 如果按照锁的颗粒度划分看,就有表锁和行锁
是MySQL中最基本的锁策略,并且是开销最小的策略。并发处理较少。表锁由MySQL服务或存储引擎管理。多数情况由服务层管理,具体看SQL操作。 例如:服务器会为诸如 ALTER TABLE 之类的语句使用表锁 ,而忽略存储引擎的锁。 加锁机制: 它会锁定整张表。一个用户在对表进行写操作(插人、删除、更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他用户才能获取到读锁。
锁定当前访问行的数据,并发处理能力很强。但锁开销最大。具体视行数据多少决定。由innoDB存储引擎支持。
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。由BDB 存储引擎管理页级锁。 面试官: 为啥是表锁开销小,而不是行锁呢? 毕竟表锁锁定是整张表 吒吒辉: 表锁锁定的是表没错,但它不是把表里面所有的数据行都上锁,相当于是封锁了表的入口,这样它只是需要判断每个请求是否可以获取到表的锁,没有就不锁定。 而行锁是针对表的每一行数据,数据量一多,锁定内容就多,故开销大。 但因它颗粒度小,锁定行不会影响到别的行。所以并发就高。而如果表锁在一个入口就卡死了,那整体请求处理肯定就会下降。 面试官: 我记得行锁里面有几种不同的实现方式,你知道吗?
您可真贴心啊,替我考虑这么多,大佬都是这么心比针细? 我要是说不知道,你老是不是又准备给出穿小鞋啦。强忍内心啃人的冲动 (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
