MYSQL锁机制

MYSQL锁机制主要包含行级锁(INNODB引擎),表级锁(MYISAM引擎),页级锁(BOB引擎)


一:MYSQL常见的几种锁机制

行级锁所实现的锁定颗粒度是最小的,发生锁定资源争用的概率也最小,能够尽可能大的提升并发处理能力;但是因为锁定资源的颗粒度小所以每次释放锁消耗的资源更多,消耗会增大,行级锁也最容易发生死锁


表级锁是最大颗粒度的锁定机制,逻辑简单,带来的系统负面影响最小;由于表级锁一次会锁定整张表所以可以很好的避免死锁的问题,但是会带来锁定资源争用的问题



(暂时只用到了表级和行级所以只介绍这两个)


二:表级锁定的两种类型

MYSQL表级锁定主要分为两种类型:一种是读锁定另一种是写锁定

何时可以获取表级读锁定的资源:资源没有被写锁定,写锁定等待队列中没有更高优先级的写锁定等待;读锁锁定之后其他的进程还是可以进行读操作的

何时可以获取表级写锁定的资源:没有被写锁定;没有被写锁定等待;没有被读锁定;写锁锁定之后其他的进程都是不能进行读操作的


在MySQL中,主要通过四个队列来维护这两种锁定:两个存放当前正在锁定中的读和写锁定信息,另外两个存放等待中的读写锁定信息,如下:

Current read-lock queue (lock->read)

Pending read-lock queue (lock->read_wait)

Current write-lock queue (lock->write)

Pending write-lock queue (lock->write_wait)



三:(INNODB)行级锁定的两种类型

MYSQL行级锁定同样分为两种类型:一种是共享锁另一种是排它锁;而在锁定机制的实现过程中为了让行级锁定和表级锁定共存,Innodb也同样使用了意向锁(表级锁定)的概念,也就有了意向共享锁和意向排他锁这两种

当一个事务需要给自己需要的某个资源加锁的时候,如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁。但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。所以,可以说Innodb的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX),我们可以通过以下表格来总结上面这四种所的共存逻辑关系:

 

共享锁(S)

排他锁(X)

意向共享锁(IS)

意向排他锁(IX)

共享锁(S)

兼容

冲突

兼容

冲突

排他锁(X)

冲突

冲突

冲突

冲突

意向共享锁(IS)

兼容

冲突

兼容

兼容

意向排他锁(IX)

冲突

冲突

兼容

兼容

 

 

 

 

 

 

 

 

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章