扫码关注公众号
数据库死锁如何解决?
死锁是指多个事务在同一资源上相互占用并请求锁定对方占用的资源而导致恶性循环的现象。当多个事务试图以不同顺序锁定资源时就可能会产生死锁,多个事
数据库锁的类型有哪些?
按照锁的粒度可以将MySQL锁分为三种:MyISAM默认采用表级锁,InnoDB默认采用行级锁。从锁的类别上区别可以分为共享锁和排他锁共享锁:共享锁又称读锁,简写为S锁,一个事务对一个数据对象加了S锁,可以对这个数据对象进行读取操作,但不能进行更新操作。并且在加锁期间其他事务只能对这个数据对象加S锁,不能加X锁。排他锁:排他锁又称为写锁,简写为X锁,一个事务对一个数据对象加了X锁,可以对这个对象进行读取和更新操作,加锁期间,其他事务不能对该数据对象进行加X锁或S锁。
MySQL中InnoDB引擎的行锁模式及其是如何实现的?
行锁模式在存在行锁和表锁的情况下,一个事务想对某个表加X锁时,需要先检查是否有其他事务对这个表加了锁或对这个表的某一行加了锁,对表的每一行都进行检测一次这是非常低效率的,为了解决这种问题,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁,两种意向锁都是表锁。意向共享锁:简称IS锁,一个事务打算给数据行加共享锁前必须先获得该表的IS锁。意向排他锁:简称IX锁,一个事务打算给数据行加排他锁前必须先获得该表的IX锁。有了意向锁,一个事务想对某个表加X锁,只需要检查是否有其他事务对这个表加了X/IX/S/IS锁即可。锁的兼容性如下:行锁实现方式:INnoDB的行锁是通过给索引上的索引项加锁实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录进行加锁。InnoDB行锁主要分三种情况:Recordlock:对索引项加锁Graplock:对索引之间的“间隙”、第一条记录前的“间隙”或最后一条后的间隙加锁。Next-keylock:前两种放入组合,对记录及前面的间隙加锁。InnoDB行锁的特性:如果不通过索引条件检索数据,那么InnoDB将对表中所有记录加锁,实际产生的效果和表锁是一样的。MVCC不能解决幻读问题,在可重复读隔离级别下,使用MVCC+Next-KeyLocks可以解决幻读问题。
什么是数据库的乐观锁和悲观锁,如何实现?
乐观锁:系统假设数据的更新在大多数时候是不会产生冲突的,所以数据库只在更新操作提交的时候对数据检测冲突,如果存在冲突,则数据更新失败。乐观锁实现方式:一般通过版本号和CAS算法实现。悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。通俗讲就是每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。悲观锁的实现方式:通过数据库的锁机制实现,对查询语句添加forupdata。