mysql儲存引擎MyISAM的併發插入

2021-08-31 16:42:10 字數 1936 閱讀 5617

都知道mysql資料庫是乙個具有多種儲存引擎的資料庫,最常用的有myisam和innodb,兩種儲存引擎。

innodb支援外來鍵,支援事務安全,資料多版本讀取,鎖定機制的改進等諸多優點,這裡就不多說了。

那麼myisam,是乙個sun公司自己開發的儲存引擎,只支援表級鎖定。

我做了這樣乙個測試,使用root登入然後建立乙個資料庫test1

mysql> create database test1;

query ok, 1 row affected (0.00 sec)

建立一張表book

mysql> create table book(id int primary key,

-> name varchar(20));

query ok, 0 rows affected (0.00 sec)

建立乙個使用者user1,具有資料庫test1上所有表的許可權

mysql> grant create,update,delete,create,insert on test1.* to 'user2'@'localhost' identified by '0312';

query ok, 0 rows affected (0.00 sec)

然後在另外開啟乙個終端,使用user2登入

在root這裡我給表book新增乙個讀鎖

mysql> lock table book read local;

query ok, 0 rows affected (0.00 sec)

再在user2端操作,然後我發現很奇怪的一件事,我能夠對錶book進行插入,但是卻沒有辦法對他進行更新。

插入操作

mysql> insert into book values(1,'gengu');

query ok, 1 row affected (0.00 sec)

更新操作

mysql> update book set name = 'gengu_update' where id = 1;
然後就一直被阻塞掉

當對它update的時候它總是會被阻塞掉,當時的我百思不得其解,怎麼會這樣呢?按道理說root把增長表都鎖定了,為什麼可以插入呢?又為什麼不能更新呢?

然後翻了很多文章終於弄清楚了原因,原來是myisam這個引擎還有乙個非常有用的特性那就是concurrent insert(併發插入)的特性。

當乙個session給一張表設定了read local,就表明給了它乙個之允許在當前session讀取的權利,但是卻沒有刪除,插入和更新的權利。

比如下面的root操作

mysql> update book set name = 'gengu2' where id = 1;

error 1099 (hy000): table 'book' was locked with a read lock and can't be updated

mysql> insert into book values(3,'gengu3');

error 1099 (hy000): table 'book' was locked with a read lock and can't be updated

mysql> delete from book where id = 3;

error 1099 (hy000): table 'book' was locked with a read lock and can't be updated

mysql>

其他的session雖然也不能進行刪除和更新操作但是卻能進行併發插入操作

具體的concurrent insert有三個引數可以配置分別是0,1,2在其他的博文中有很多的描述,這裡就不多說了。

Mysql 儲存引擎之 MyISAM儲存引擎

myisam是預設儲存引擎。每個myisam在磁碟上儲存成三個檔案。frm檔案儲存表定義 myd檔案儲存資料 myi檔案儲存索引。要明確表示你想要用乙個myisam 請用engine表選項指出來 create table test myisam id int engine myisam 2 如下是m...

MyISAM儲存引擎

myisam是預設儲存引擎。它基於更老的isam 但有很多有用的擴充套件。注意mysql 5.1不支援isam 每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。frm檔案儲存表定義。資料檔案的擴充套件名為.myd mydata 索引檔案的副檔名是.myi ...

MyISAM儲存引擎

支援事務,支援外來鍵,尤其是訪問速度快,對事務完 整性沒有要求或者以select insert為主的應用基本都可以使用這個引擎來建立表。每個myisam在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為 1 frm 儲存表定義 2 myd mydata,儲存資料 3 myi myinde...