Mysql锁机制
2020-05-25 本文已影响0人
百事可乐丶
基本上锁是根据不同的存储引擎
锁
表锁:开销小,加锁快,锁力度大,锁冲突高,并发能力低
行锁:开销大,加锁慢(需要通过索引查询,然后加锁),锁冲突低,并发能力高
页锁:介于两者之间(PS:由于BDB已经被InnoDB所取代,我们只讨论MyISAM表锁和InnoDB行锁的问题)
表锁:
共享读锁,独占写锁
表锁
行锁:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
行锁
理解:
就是在加行锁的时候需要获取对应的意向锁,其他行锁进来操作不同的行是互不影响的,但是对那些没有利用索引检索加锁的语句就会进行表意向锁校验,简单一点就是,大家都用索引修改,修改不同的行互不影响,但是没用索引,并不知道修改的是哪一行数据,默认加表锁都不让修改
重点,重点重点:要使用行锁必须必须用索引.不然默认是表锁,
即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引