十大经典思维面试题 阿里巴巴面试题及答案

我们在操作数据库的时候,可能会出现并发问题导致的数据不一致(数据冲突) 。诸如
如何保证并发数据访问的一致性和有效性是所有数据库都必须解决的问题,锁的冲突也是如此 。
影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对于数据库尤为重要 。
重要 。
MySQL锁概述
与其他数据库相比,MySQL的锁机制相对简单,其最显著的特点是支持不同的存储引擎 。
不同的锁定机制 。
例如:
MyISAM和内存存储引擎使用表级锁定;
InnoDB存储引擎支持行级锁定和表级锁定,但默认情况下,它采用 。
使用行级锁 。
MySQL的两个主要锁的特性可以总结如下:
阿里P8架构师讲MySQL行锁、表锁、悲观锁、乐观锁的特点和应用 。
关卡锁定:低开销,快速锁定;不会出现死锁(因为MyISAM会一次性获得SQL需要的所有锁);
锁粒度大,锁冲突概率最高,并发性最低 。
关卡锁:成本高,锁死慢;将出现死锁;锁定粒度最小,锁定冲突概率最低,并发性最低 。
也是最高的 。
页锁:成本和锁速度介于表锁和行锁之间;将出现死锁;锁定粒度介于表锁和行锁之间,
并发程度一般
行锁和表锁
1.主要是针对锁粒度的分类,一般分为行锁、表锁、库锁 。
(1)行锁:访问数据库时,锁定整行数据,防止并发错误 。
(2)表锁:访问数据库时,锁定整个表数据,防止并发错误 。
2.行锁和表锁的区别:
表:低开销,快速锁定,无死锁;锁强度高,锁冲突概率高,并发性最低 。
行锁:成本高,锁慢,死锁;锁粒度小,锁冲突概率低,并发度高 。
悲观锁和乐观锁
(1)悲观锁:顾名思义,非常悲观 。每次拿到数据,我都觉得别人会修改,所以每次,
当您获取数据时,它将被锁定,以便其他想要获取此数据的人会阻止它,直到它获得锁 。
这些锁定机制中有许多是在传统的关系数据库中使用的,比如行锁、表锁、读锁、写锁等 。
可以,操作前锁好 。
(2)乐观锁定:顾名思义,非常乐观 。每次拿到数据,我都觉得别人不会修改,所以没有
会被锁定,但是更新的时候会判断这段时间内是否有其他人更新过这个数据,版本可以使用 。
不 。机制 。乐观锁定适用于多读应用程序类型,这可以提高吞吐量,例如如果数据库提供类似的
write_condition机制实际上是提供的乐观锁定 。
(3)悲观锁和乐观锁的区别:
两种锁都有各自的优点和缺点,不应该认为一种比另一种好 。比如乐观锁就适合写的比较少的情况,也就是冲突 。
当这种情况很少发生时,这可以节省锁定的开销并增加系统的总吞吐量 。但是如果你经常生孩子
冲突,上层应用会不断重试,这会降低性能,所以在这种情况下使用悲观锁 。
比较合适 。
共享锁
共享锁意味着对于许多不同的事务,同一个锁被同一个资源共享 。相当于同门,
它有多个键 。就像这样,你家有个大门,大门有几把钥匙 。你有一个,你的女儿 。
一个朋友有一个 。你们都可以通过这把钥匙进入你们的家 。这就是所谓的共享锁 。
刚才说了,对于悲观锁,一般数据库都实现了,共享锁也是悲观锁的一种,所以共享锁
mysql中调用什么命令?通过查询信息,我们知道通过在执行语句后添加锁
在共享模式下意味着在一些资源上设置共享锁 。
什么时候使用表锁?
对于InnoDB表,大多数情况下应该使用行级锁,因为事务和行锁通常是我们
选择InnoDB表的原因 。但是在一些特殊的事务中,也可以考虑表级锁 。
第一种情况是事务需要更新大部分或者全部数据,表比较大 。如果使用默认的行锁,则不
只有这个交易效率低,而且可能会造成其他乘务长时间等待锁和锁冲突 。在这种情况下,可以进行测试 。
使用表锁来提高该事务的执行速度 。
第二种情况是事务涉及多个表,相当复杂,很可能造成死锁,导致大量事务回滚 。这样的
还可以考虑将事务涉及的表锁定一次,避免死锁,减少事务回滚导致的数据库打开 。
销售 。
当然,应用程序中这两个事务不能太多,否则,应该考虑使用MyISAM表 。
表锁和行锁应用场景:
表锁的使用和并发性不高,且以查询为主,少数更新的应用,如小型web应用;
行级锁适用于高并发环境下对事务完整性要求较高的系统,如在线事务处理系统 。


推荐阅读