Mysql锁机制

基本上锁是根据不同的存储引擎


表锁:开销小,加锁快,锁力度大,锁冲突高,并发能力低
行锁:开销大,加锁慢(需要通过索引查询,然后加锁),锁冲突低,并发能力高
页锁:介于两者之间(PS:由于BDB已经被InnoDB所取代,我们只讨论MyISAM表锁和InnoDB行锁的问题)

表锁:
共享读锁,独占写锁


表锁

行锁:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。


行锁

理解:
就是在加行锁的时候需要获取对应的意向锁,其他行锁进来操作不同的行是互不影响的,但是对那些没有利用索引检索加锁的语句就会进行表意向锁校验,简单一点就是,大家都用索引修改,修改不同的行互不影响,但是没用索引,并不知道修改的是哪一行数据,默认加表锁都不让修改

重点,重点重点:要使用行锁必须必须用索引.不然默认是表锁,

即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引

详细:https://blog.csdn.net/zxh2075/article/details/83503012

你可能感兴趣的:(Mysql锁机制)