本篇文章说明mysql的几个锁的情况。

MyISAM锁问题

我们使用存储引擎 MyISAM进行锁测试。MyISAM锁分为两种模式,第一种 表共享锁(Table Read Lock)和表独占写锁(Table Write Lock)。在多个线程同时需要写入的情况下,当一个线程获得对一个表的写锁后,只有持有锁线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。MyISAM引擎中,锁的操作,在读(select)之前会自动加上读锁,在写(update,insert)之前会自动加上写锁。当然也可以手动使用如下语句加表锁,

LOCK tables [table_name] [mode] [local][,[table_name] [mode] [local]];

unlock tables;#释放锁

tablename 表名,mode read|write 读锁|写锁 ,local 如果加上local字符串,则当当前进程获取到读锁时,其他进程则可以在表末尾插入记录。接下来进行试验验证(创建一个表 test_myisam)结构如下:

开启另一个终端:

因为自动加锁很难感知存在,所以我们使用手动加锁方式进行锁的演示。读锁测试

测试三点。1.获取读锁时别的进程是否能够能够读。2.获取读锁时别的进程是否可以进行update或者insert操作。3.加local情况下测试2 。实验如下终端1终端2终端2终端1终端2

加字符串local状况测试:终端1终端2

实验结论: 当我们使用读锁时 ,别的进程一样是可以读取信息,只是更新操作是会等待,锁的释放,添加操作是在于我们设置的变量,是否允许锁时插入。

2. 写锁测试

主要测试两点。1.获取写锁时别的进程是否能够能够读。2.获取写锁时别的进程是否可以进行update或者insert操作。实验如下终端1终端2终端2终端2终端1

实验总结:当进程获取了写锁时,其他进程时不能进行任何操作。所以我们得注意锁的使用和在什么情况下会有锁。