本文主要是介绍innodb的意向锁有什么作用?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
innodb的意向锁有什么作用?
mysql官网上对于意向锁的解释中有这么一句话
“The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.”
意思是说加意向锁的目的是为了表明某个事务正在锁定一行或者将要锁定一行。
那么,意向锁的作用就是“表明”加锁的意图,可是为什么要表明这个 意图呢?
如果仅仅锁定一行仅仅需要加一个锁,那么就直接加锁就好了,这里要表明加锁意图的原因是因为要锁定一行不仅仅是要加一个锁,而是要做一系列操作吗?
主要原因其实是因为InnoDB既支持行锁也支持表锁。并且表锁和行锁之间是互斥的。也就是给一个表加表锁之前需要确保它的行锁已经释放了,否则就需要等待行锁释放才能加表锁。那么InnoDB加表锁的时候怎么判断这个表有没有加行锁呢?如果没有意向锁的话就只能去内存中存放全部锁信息的HASH表中遍历,查看当前表的数据行有没有被加锁。显然这种判断方式是低效的。为了避免通过遍历的方式判断加锁信息,就引入了意向锁。这样只要表中数据行被加上了排他锁,就给这个表加上一个意向排他锁,用来标识这个表中已经有数据行持有排他锁了。同样,只要表中数据行被加上了共享锁,就给这个表加上一个意向共享锁,用来标识这个表中已经有数据行持有共享锁了。所以意向锁的本质是一种标识锁,所以意向锁之间不管是共享锁还是互斥锁都是不存在互斥关系的,也就是说意向锁之间不会互相阻塞。
注意:申请意向锁的动作是数据库完成的,就是说,事务A申请一行的行锁的时候,数据库会自动先开始申请表的意向锁,不需要我们程序员使用代码来申请。
这篇关于innodb的意向锁有什么作用?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!