你好,为了学习,我正试图让SQL select语句被另一个简单的select或update语句阻塞。我只喜欢InnoDB表。
为了准备测试,我创建了一个表
CREATE TABLE `test`.`client` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
并将1,000,000行插入到表中。
现在我要开始测试了。
在MySQL客户机#1中,我删除了所有行:
mysql #1> delete from client;
当删除仍在执行时,在另一个MySQL客户机#2中,我尝试选择一行。
mysql #2> select * from client where id=1;
+---------+------+
| id | name |
+---------+------+
| 1 | joe |
+---------+------+
1 row in set (0.00 sec)
结果立即显示,选择没有被阻止。
接下来,我将尝试另一个测试。我在表中插入了1,000,000行。
在MySQL客户机#1中,我更新所有行:
mysql #1> update client set name='Bill';
当更新仍在执行时,在另一个MySQL客户机#2中,我尝试选择一行。
mysql #2> select * from client where id=100;
+-----+------+
| id | name |
+-----+------+
| 100 | joe |
+-----+------+
1 row in set (0.00 sec)
mysql #2> select * from client where id=1000;
+------+------+
| id | name |
+------+------+
| 1000 | joe |
+------+------+
1 row in set (0.00 sec)
结果立即显示,选择没有被阻止。
因此,现在我的问题是,如何使用InnoDB表演示一个select语句被另一个简单的select或update语句阻塞?或者MySQL从来没有任何阻塞问题?
PS我并不试图模拟两个进程之间的死锁,只是一个大的更新或插入阻塞一个select。
发布于 2013-05-09 19:32:19
选择的死锁可以通过多种方式完成。我写过关于他们的文章
LOCK TABLES table READ;
SELECT ... ;
UNLOCK TABLES;
SERIALIZEABLE isoaltion level
文档说:此级别类似于可重复读取,但InnoDB隐式地将所有普通SELECT语句转换为选择.如果禁用自动提交,则锁定共享模式。如果启用了自动提交,则SELECT是它自己的事务。因此,它已知为只读,如果作为一致(非锁定)读取执行,则可以序列化,并且不需要为其他事务阻塞。(若要强制普通SELECT阻止其他事务修改选定行,请禁用自动提交。)
切入正题,你可以用
SELECT
。UPDATE
或DELETE
这些行试试看!!
https://dba.stackexchange.com/questions/41865
复制相似问题