一、MySQL锁的理解当数据库有并发事务时,可能会出现数据不一致的情况。这时候就需要一些机制来保证访问的顺序,锁机制就是这样一种机制。就像酒店的房间,如果人随意进出,就会有多人抢劫同一个房间,房间上安装了一把锁,申请钥匙的人可以入住并锁上房间,而其他人必须等到他用完之后才能再次使用。2.隔离级别和锁的关系。在ReadUncommitted级别,读取数据不需要共享锁,这样就不会与修改数据的排他锁发生冲突。在ReadCommitted级别,读取操作需要共享锁。但是共享锁是在语句执行完后释放的。在RepeatableRead级别,读操作需要共享锁,但是共享锁在事务提交前是不会释放的,即事务完成后必须释放共享锁。SERIALIZABLE是限制性最强的隔离级别,因为它锁定了整个范围的键并持有锁直到事务完成。3、数据库锁按锁的粒度有哪些?锁机制和InnoDB锁算法在关系型数据库中,数据库锁按照锁的粒度可以分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎)。MyISAM和InnoDB存储引擎使用的锁:MyISAM使用表级锁。InnoDB支持行级锁和表级锁,默认是行级锁。行级锁、表级锁、页级锁vs.行级锁:MySQL中锁定粒度最细的一种锁,即只锁定当前操作的行。行级锁可以大大减少数据库操作中的冲突。它的加锁粒度最小,但加锁开销也是最大的。行级锁分为共享锁和排它锁。特点:开销大,加锁慢;会有死锁;锁粒度最小,锁冲突概率最低,并发度最高。表级锁:MySQL中锁定粒度最大的一种锁,即锁定当前正在操作的整个表。实现简单,占用资源少,大多数MySQL引擎都支持。最常用的MyISAM和InnoDB都支持表级锁定。表级锁分为表共享读锁(sharedlocks)和表排他写锁(exclusivelocks)。特点:开销小,锁紧速度快;没有死锁;锁粒度大,锁冲突概率最高,并发度最低。页级锁:是MySQL中的一种锁,锁定粒度介于行级锁和表级锁之间。表级锁速度快,但冲突多,行级锁冲突少,但速度慢。因此,采用折衷的页级别来一次锁定一组相邻的记录。特点:开销和加锁时间介于表锁和行锁之间;可能会出现死锁;锁粒度介于表锁和行锁之间,并发度一般。4、MySQL在锁类型上有哪些锁?像上面这样加锁不会有点影响并发效率吗?从锁的种类来看,有共享锁和排它锁。共享锁:又称读锁。当用户要读取数据时,在数据上加一个共享锁。可以同时添加多个共享锁。独占锁:也叫写锁,当用户要写入数据时,在数据上加一个独占锁。只能加一个排他锁,与其他排他锁、共享锁互斥。以上面的例子来说,用户行为有两种,一种是看房,多人一起看房是可以接受的。一种是真正的一晚住宿,期间既不允许有想入住的人,也不允许有想看房的人。锁的粒度取决于具体的存储引擎。InnoDB实现了行级锁、页级锁和表级锁。它们的锁开销从大到小,并发能力也是从大到小。5、MySQL中InnoDB引擎的行锁是如何实现的?InnoDB是根据索引完成行锁的例子:select*fromtab_with_indexwhereid=1forupdate;forupdate可以根据条件完成行锁加锁,而id是有索引键的列,如果id不是索引键,那么InnoDB会完成表锁,并发就无从谈起了六、InnoDB存储引擎锁算法有3种1.Recordlock:对单行记录加锁2.Gaplock:gaplock,锁定一个范围,不包括记录本身3.Next-keylock:record+gap锁定一个范围,包括记录本身七、相关知识点:Innodb使用next-keylock进行行查询-keylock降级为recordkeyGaplock是为了防止多个事务往同一个范围插入记录,会导致幻读问题。显式关闭间隙锁有两种方式:(除外键约束和唯一性检查外,其他情况只使用记录锁)A.设置事务隔离级别为RCB。将参数innodb_locks_unsafe_for_binlog设置为1。8.什么是死锁?如何处理?死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方的资源,从而形成恶性循环的现象。常见的死锁解决方法:1.如果不同的程序并发访问多个表,尽量约定以相同的顺序访问这些表,这样可以大大降低死锁的几率。2、在同一个事务中,尽量一次性锁定所有需要的资源,减少死锁的概率;3、对于非常容易出现死锁的业务部分,可以尝试使用升级的锁定粒度,通过表级锁定来降低死锁的概率;如果业务处理不好,可以使用分布式事务锁或者乐观锁。9、数据库中什么是乐观锁和悲观锁?它是怎么发生的?数据库管理系统(DBMS)中并发控制的任务是在多个事务同时访问数据库中的同一数据时,保证事务的隔离性和统一性以及数据库的统一性不被破坏。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制中使用的主要技术手段。悲观锁:假设会发生并发冲突,所有可能违反数据完整性的操作都被阻塞。当查询数据时,事务被锁定,直到事务被提交。实现方法:使用数据库中的锁机制乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反了数据完整性。修改数据时,锁定事务,按Version锁定。实现方式:一般会采用版本号机制或者CAS算法。两种锁的使用场景从上面两种锁的介绍中,我们知道两种锁各有优缺点,不能认为哪一种就比哪种好。乐观锁适用于写操作比较少的情况(多看Scenarios),也就是真正很少发生冲突的时候,这样可以节省加锁的开销,提高系统的整体吞吐量。但是如果写的多了,往往会发生冲突,导致上层应用不断重试,反而会降低性能。所以写量比较多的场景使用悲观锁比较合适。原文:https://ask.naixuejiaoyu.com/...
