首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何阻止select语句?

如何阻止select语句?
EN

Database Administration用户
提问于 2013-05-09 19:02:25
回答 1查看 8.1K关注 0票数 5

你好,为了学习,我正试图让SQL select语句被另一个简单的select或update语句阻塞。我只喜欢InnoDB表。

为了准备测试,我创建了一个表

代码语言:javascript
运行
复制
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中,我删除了所有行:

代码语言:javascript
运行
复制
mysql #1> delete from client;

当删除仍在执行时,在另一个MySQL客户机#2中,我尝试选择一行。

代码语言:javascript
运行
复制
mysql #2> select * from client where id=1;
+---------+------+
| id      | name |
+---------+------+
| 1       | joe  |
+---------+------+
1 row in set (0.00 sec)

结果立即显示,选择没有被阻止。

接下来,我将尝试另一个测试。我在表中插入了1,000,000行。

在MySQL客户机#1中,我更新所有行:

代码语言:javascript
运行
复制
mysql #1> update client set name='Bill';

当更新仍在执行时,在另一个MySQL客户机#2中,我尝试选择一行。

代码语言:javascript
运行
复制
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。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-05-09 19:32:19

选择的死锁可以通过多种方式完成。我写过关于他们的文章

此级别类似于可重复读取,但InnoDB隐式地将所有普通SELECT语句转换为选择.如果禁用自动提交,则锁定共享模式。如果启用了自动提交,则SELECT是它自己的事务。因此,它已知为只读,如果作为一致(非锁定)读取执行,则可以序列化,并且不需要为其他事务阻塞。(若要强制普通SELECT阻止其他事务修改选定行,请禁用自动提交。)

切入正题,你可以用

  • 选择。若要更新,请对这些行尝试SELECT
  • 选择。锁定共享模式,然后尝试UPDATEDELETE这些行
  • 请参阅MySQL文档

试试看!!

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/41865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档