12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-11-26 22:10:06
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
对于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)
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19