• ADADADADAD

    怎么进行MySQL 5.5 MyISAM表锁测试[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:10:06

    作者:文/会员上传

    简介:

    对于MyISAM表,加的锁是表级锁;写操作会阻塞读操作,读操作会阻塞写操作,写操作会阻塞写操作;读操作不会阻塞读操作。测试一,会话①的读操作阻塞会话②的写操作 会话① mysql> creat

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    对于MyISAM表,加的锁是表级锁;写操作会阻塞读操作,读操作会阻塞写操作,写操作会阻塞写操作;读操作不会阻塞读操作。

    测试一,会话①的读操作阻塞会话②的写操作
    会话①
    mysql> create table t2(id tinyint(3) unsigned not null auto_increment,
    -> name varchar(10) not null,
    -> primary key(id))
    -> engine=myisam auto_increment=8 default charset=gbk;
    Query OK, 0 rows affected (0.03 sec)
    mysql> insert into t2(name) values('Neo');
    Query OK, 1 row affected (0.03 sec)
    mysql> insert into t2(name) values('Trinity');
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from t2;
    +----+---------+
    | id | name|
    +----+---------+
    | 8 | Neo |
    | 9 | Trinity |
    +----+---------+
    2 rows in set (0.00 sec)

    mysql> desc t2;
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type| Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+----------------+
    | id| tinyint(3) unsigned | NO| PRI | NULL| auto_increment |
    | name | varchar(10) | NO| | NULL||
    +-------+---------------------+------+-----+---------+----------------+
    2 rows in set (0.09 sec)

    为表增加读锁
    mysql> lock table t2 read;
    Query OK, 0 rows affected (0.00 sec)

    会话②
    mysql> select * from t2;
    +----+---------+
    | id | name|
    +----+---------+
    | 8 | Neo |
    | 9 | Trinity |
    +----+---------+
    2 rows in set (0.00 sec)

    会话会处于等待状态
    mysql> update t2 set name='James' where id=5;

    会话①
    mysql> show processlist;
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+---------------------------------------+
    | Id | User| Host | db| Command | Time| State| Info |
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+---------------------------------------+
    | 1 | system user || NULL | Connect | 748155 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
    | 2 | system user || NULL | Connect | 748156 | Connecting to master| NULL |
    | 13 | event_scheduler | localhost | NULL | Daemon | 600105 | Waiting on empty queue | NULL |
    | 74 | neo | localhost | fire | Query| 0 | NULL| show processlist |
    | 75 | neo | localhost | fire | Query| 83 | Waiting for table level lock| update t2 set name='James' where id=5 |
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+---------------------------------------+
    5 rows in set (0.00 sec)

    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)

    会话②
    mysql> update t2 set name='James' where id=5;
    Query OK, 0 rows affected (1 min 48.96 sec)
    Rows matched: 0 Changed: 0 Warnings: 0

    测试二,会话①的写操作阻塞会话②的读操作

    会话①
    mysql> lock table t2 write;
    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into t2(name) values('Jack');
    Query OK, 1 row affected (0.01 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)

    mysql> show processlist;
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+------------------+
    | Id | User| Host | db| Command | Time| State| Info |
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+------------------+
    | 1 | system user || NULL | Connect | 748422 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
    | 2 | system user || NULL | Connect | 748423 | Connecting to master| NULL |
    | 13 | event_scheduler | localhost | NULL | Daemon | 600372 | Waiting on empty queue | NULL |
    | 74 | neo | localhost | fire | Query| 0 | NULL| show processlist |
    | 75 | neo | localhost | fire | Query| 2 | Waiting for table metadata lock | select * from t2 |
    +----+-----------------+-----------+------+---------+--------+-----------------------------------------------------------------------------+------------------+
    5 rows in set (0.00 sec)

    会话②
    查询会阻塞
    mysql> select * from t2;

    会话①
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)

    会话②
    mysql> select * from t2;
    +----+---------+
    | id | name|
    +----+---------+
    | 8 | Neo |
    | 9 | Trinity |
    | 10 | Jack|
    +----+---------+
    3 rows in set (47.89 sec)

    当同一个会话中,锁定一张表后,查询另外一张表会报错
    mysql> lock table test read;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from test where id=80;
    +------+------+
    | id | name |
    +------+------+
    | 80 | Lily |
    +------+------+
    1 row in set (0.00 sec)

    mysql> select * from t70;
    ERROR 1100 (HY000): Table 't70' was not locked with LOCK TABLES

    使用表的别名会报错
    mysql> lock table test read;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from test t where id=80;
    ERROR 1100 (HY000): Table 't' was not locked with LOCK TABLES

    需要对别名进行锁定

    mysql> lock table test t read;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from test t where id=80;
    +------+------+
    | id | name |
    +------+------+
    | 80 | Kame |
    +------+------+
    1 row in set (0.00 sec)

    怎么进行MySQL 5.5 MyISAM表锁测试.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: myisammysql