欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql的锁原理

程序员文章站 2022-06-02 13:04:15
...
myisam:
只有表锁,分为表共享读锁,表排他写锁。不支持事务
表共享读锁:session1:lock table a read ; 此session1能对只能对a表读,其他都干不了,其他的session能对这个表读。直到unlock tables;
表排他锁:session1:lock table a write; 此session1能对a表进行update,insert,select,delete; 其他的session对这个表什么都干不了;
myisam在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。
LOCK TABLE时加了“local”选项,其作用就是在满足MyISAM表并发插入条件的情况下,允许其他用户在表尾并发插入记录并非插入(lock table a read local的时候):
当concurrent_insert设置为0时,不允许并发插入。
当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
myisam:读锁和写锁是串行的,总是写锁先获得资源。就算是读锁先排队的,写锁后排队的,一样时写锁获得资源

innodb:支持事务,有表锁,行锁 
行锁:排他锁,共享锁
共享锁:又称读锁。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。session1对数据a加了共享锁,session1只能对a读不能更改,其他session也只能对a加共享锁去读,不能加排他锁。
排他锁:又称写锁。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。session1对a加了排他锁,session1能对a更改,其他session不能再对a加任何的锁。但是因为select默认不加任何锁,所以可以select
InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。