数据库常见面试题乐观悲观锁,行锁表锁

数据库面试题

MySQL数据库常见面试题:阐述乐观、悲观锁,、表锁,读、写锁,间隙锁

(重要,好多公司都考)

解析参考

根据加锁范围

全局锁:是对整个数据库实例加锁。常的场景是全库逻辑备份(也就是把整库每个表都select出来存成本),对于InnoDB可以可重复读这隔离级别进备份,但是对于MyISAM只能全局锁表级锁。

表锁:locktablest1read,t2write;那么该线程只能读t1,写t2,其他线程只能写t1,读t2。

元数据锁:即MDL,MySQL5.5版本引。当对个表做增删改查操作的时候,加MDL读锁;当要对表变更操作的时候,加MDL写锁。读锁之间不互斥,读写锁之间、写锁之间是互斥的。

MySQL所有引擎都持表锁。

级锁

由各个引擎实现。

即锁定某个表中的特定,并发度,锁粒度低。

在InnoDB事务中,锁是在需要的时候才加上的,但并不是不需要了就刻释放,是要等到事务结束时才释放,这个就是两阶段锁协议。

锁容易产死锁,此时需要使InnoDB的主动死锁检测。

在InnoDB中,级锁都是基于索引的,如果条SQL语句不到索引是不会使级锁的,会

使表级锁把整张表锁住。

间隙锁(GAP)

是个范围于表锁,于锁的锁,主要是为了防幻读。

如果查询条件没有建索引或者不是唯索。引,则会加上间隙锁(普通查询是快照读,这不考虑)。

加锁范围是查询条件的两侧。

根据锁的读写式

共享锁称为读锁,简称S锁。共享锁就是多个事务对于同数据可以共享把锁,都能访问到数据,但是只能读不能修改。

排他锁称为写锁,简称X锁。排他锁就是不能与其他锁并存,如个事务获取了个数据的排他锁,其他事务就不能再获取该的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就读取和修改

SS锁不互斥,SX和XX锁都互斥

根据锁的特征

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别会修改,所以每次在拿数据的时

候都会上锁,这样别想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库边就到了很多这种锁机制,如锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别不会修改,所以不会上锁,但是在更新的时候会判断下在此期间别有没有去更新这个数据,可以使版本号机制和CAS算法实现。乐观锁适于多读的应类型,这样可以提吞吐量。使版本号时,可以在数据初始化时指定个版本号,每次对数据的更新操作都对版本号执+1操作。并判断当前版本号是不是该数据的最新的版本号,如果不是,则重新更新。在JDK中的些包,如java.util.concurrent.atomic包下的原变量类就是使了乐观锁的种实现式CAS实现的。

乐观锁在不发取锁失败的情况下开销悲观锁,但是旦发失败回滚开销则较,因此适合在取锁失败概率较的场景,可以提升系统并发性能

乐观锁还适于些较特殊的场景,例如在业务操作过程中法和数据库保持连接等悲观锁法适的地。

以上就是小科今天整理提供的MySQL面试题,你记住并理解了吗?希望以上的内容能够为学习C++、MySQL的同学提供了有用的面试素材及学习素材,以后小科每日均会提供MySQL、Python及Web相关的习题,赶快学习起来吧。




转载请注明:http://www.aierlanlan.com/grrz/4428.html