
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在讲线程安全的时候曾经给大家提到过锁的概念与应用,今天我们就通过案例分析来简单了解一下,MySQL锁的类型与作用分析。
1、表级锁和行级锁了解吗?有什么区别?
MyISAM仅仅支持表级锁(table-levellocking),一锁就锁整张表,这在并发写的情况下性非常差。
InnoDB不光支持表级锁(table-levellocking),还支持行级锁(row-levellocking),默认为行级锁。行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说,InnoDB的性能更高。
表级锁和行级锁对比:
表级锁:MySQL中锁定粒度大的一种锁,是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度大,触发锁冲突的概率高,并发度低,MyISAM和InnoDB引擎都支持表级锁。
行级锁:MySQL中锁定粒度小的一种锁,是针对索引字段加的锁,只针对当前操作的记录进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度小,并发度高,但加锁的开销也大,加锁慢,会出现死锁。
2、行级锁的使用有什么注意事项?
InnoDB的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行UPDATE、DELETE语句时,如果WHERE条件中字段没有命中索引或者索引失效的话,就会导致扫描全表对表中的所有记录进行加锁。这个在我们日常工作开发中经常会遇到,一定要多多注意!!!
不过,很多时候即使用了索引也有可能会走全表扫描,这是因为MySQL优化器的原因。
3、共享锁和排他锁呢?
不论是表级锁还是行级锁,都存在共享锁(ShareLock,S锁)和排他锁(ExclusiveLock,X锁)这两类:
共享锁(S锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
排他锁(X锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。
4、意向锁有什么作用?
如果需要用到表锁的话,如何判断表中的记录没有行锁呢?一行一行遍历肯定是不行,性能太差。我们需要用到一个叫做意向锁的东东来快速判断是否可以对某个表使用表锁。
意向锁是表级锁,共有两种:
意向共享锁(IntentionSharedLock,IS锁):事务有意向对表中的某些加共享锁(S锁),加共享锁前必须先取得该表的IS锁。
意向排他锁(IntentionExclusiveLock,IX锁):事务有意向对表中的某些记录加排他锁(X锁),加排他锁之前必须先取得该表的IX锁。
意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享/排他锁之前,InooDB会先获取该数据行所在在数据表的对应意向锁。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。