|
原帖由 ucgary 于 2011-4-2 13:31 发表 ![]()
对WRITE,MySQL使用的表锁定方法原理如下:
如果在表上没有锁,在它上面放一个写锁。
否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
如果在表上没有写锁定,把一个读锁定放在它上面。
否则,把锁请求放在读锁定队列中。
当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。
这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。
-----------------
· 一个客户发出长时间运行的查询。
· 然后,另一个客户对同一个表进行更新。该客户必须等待直到SELECT完成。
· 另一个客户对同一个表上发出了另一个SELECT语句。因为UPDATE比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个SELECT完成。
不是很明白:
· 1 第一个客户发出长时间运行的查询。
· 2 然后,第二个客户对同一个表进行更新。该客户必须等待直到SELECT完成。
· 3 第三个客户对同一个表上发出了另外一个SELECT语句。因为UPDATE比SELECT优先级高,该SELECT语句等待UPDATE完成,并且等待第1个客户的SELECT完成
在第三个客户是何时执行select操作的?是跟第二个客户同时执行的吗?在第三个客户自行select的时候,第二个客户正在执行update,这个时候第一个客户的select早执行完了吧
为什么第三个客户在第二个客户执行完update后海需要等待第一个客户执行完select呢? 根本没有必要吧,因为第一个客户的select早就第二个客户执行update之前就已经执行完了。 |
|