MYISAM表锁

MyISAM表的读操作会阻塞写操作,而写操作会阻塞所有读和写。但在满足并发插入条件时,INSERT和SELECT可以并发执行。MySQL允许通过设置如low-priority-updates来调整读写优先级,以及使用max_write_lock_count来缓解读写冲突。长时间运行的查询应尽量避免,以减少锁冲突。
摘要由CSDN通过智能技术生成
  MYISAM存储引擎只支持表锁,并且不支持事物
 MySQL的表级锁有两种模式:表共享读锁(table read lock)和表独占写锁(table write lock)。
 注意:只有读锁和读锁是兼容的,其他的组合都不兼容,需要等待(这里有个特例,当满足并发插入条件时,INSERT和SELECT操作是可以并行执行的)。

对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读

和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!根据如表20-2所示的 例子可以知道,当一个线程获得对一个表的写锁后,只

有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

  实验一、MYISAM写阻塞读的例子
 
 session1														session2
 --创建表
mysql> create table film_text(file_id int,
    ->        title varchar(20),primary key(file_id)
    ->    )engine=myisam;
Query OK, 0 rows affected (0.04 sec)

mysql> insert into film_text values(1001,'update test');
Query OK, 1 row affected (0.00 sec)
 
 --获得file_text表的write锁
mysql>  lock table film_text write;
Query OK, 0 rows affected (0.00 sec)

 --当前的会话对表的查询、更新、插入操作都可以执行
mysql> select * from film_text where file_id=1001;
+---------+-------------+
| file_id | title       |
+---------+-------------+
|    1001 | update test |
+---------+-------------+
1 row in set (0.00 sec)

                                                            --session2对锁定表的查询被阻塞,需要等待锁被释放(以便获得表级读锁)
															mysql> select * from film_text where file_id=1001;

mysql> insert into film_text values(1003,'test');
Query OK, 1 row affected (0.00 sec)

mysql> update film_text set title='test' where file_id=1001;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

--释放锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

                                                             --session2获得读锁,查询返回
															+---------+-------+
															| file_id | title |
															+---------+-------+
															|    1001 | test  |
															+---------+-------+
															1 row in set (1 min 25.25 sec)

 说明:MYISAM在执行查询语句(select)前,会自动给设计的所有表加读锁,在执行更新操作(update、delete、insert等)前,会自动给设计的表

加写锁,这个过程 并不需要用户手动干预,因此,用户一般不需要直接用lock table命令给myisam表显示加锁。例子中,显示加锁是为了方便说明问

题,并非必须如此。

实验二、MYISAM存储引擎读阻塞写的例子

 session1										session2
 
 --获得film_text的READ锁
mysql> lock table film_text read;
Query OK, 0 rows affected (0.00 sec)
 
 --session1可以查询该表的记录
mysql> select * from film_text where file_id=1001;
+---------+-------+
| file_id | title |
+---------+-------+
|    1001 | test  |
+---------+-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值