MYSQL锁机制---MyISAM表锁

  对于我们的一个应用来说,并发问题是不可忽视的。其实每一个网站都存在着并发的问题,只是平时这些网站的并发数不够多而显得没有问题罢了。言归正传,mysql作为现在众多网站中使用的数据库之一,当然自己也有一套机制去解决并发问题,那就是锁机制。

在mysql中有许多存储引擎,其中 InnoDB和MyISAM和我们常用的两大存储引擎。锁机制主要有两大类,一是表锁,二是行锁,而其中MyISAM只支持表锁,InnoDB则支持表锁和行锁,默认情况使用的是行锁。其中表锁与行锁的性能区别:

  • 表锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。  

MyISAM表锁 

在MyISAM存储引擎中,使用到的锁机制是表锁,其中表锁又可分为两大类:表共享读锁表独占写锁。

表共享读锁

首先我们来看下表共享读锁的例子:

可以看到我们第一个客户端(即一个进程)给表加上了读锁后,自己的读操作时没有问题的

dept表加了读锁后,不能对其进行写入操作。

加锁之后不能对其他表进行读操作。

其他客户端也能对加了锁的dept表进行读操作。

其他客户端对加了锁的dept表进行写操作会发生堵塞。

给dept表加了锁的客户端那对其进行解锁。此时我们再看下第二个客户端

此时第二个客户端写操作成功了。

表共享读锁总结:其实表共享读锁对于读操作来说是共享的,而对于写操作来说加锁的客户端进程在表被锁期间是不允许的,对于其他客户端进程来说则会阻塞。给表加锁的客户端进程在表加锁期间,不能对其他表进行读操作,直到该表被解锁才能执行对其他表的读操作。

表独占写锁

还是来看下表独占写锁的例子

对dept表加写锁之后,加锁的客户端进程可以对其进行读操作和写操作,但是在该表被锁期间,加锁的客户端进程不能对其他表进行读操作,这一点与表共享读锁一致。

dept表被解锁后

可以看到在非加锁客户端中对加了写锁的表进行读操作以及写操作都是被阻塞的,直到操作的表被解锁。

表独占写锁总结:被加上了写锁的表,在加锁期间,加锁的客户端进程能对其进行读写操作,不能对其他的表进行读写操作,而非加锁的客户端进程对加了写锁的表进行读写操作都会被阻塞,直到该表被解锁为止。

表锁总结:读锁会阻塞写,不会阻塞读,写锁读写都会阻塞。MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个 MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!

猜你喜欢

转载自blog.csdn.net/weixin_37689658/article/details/98343525