mysql select是否会锁表 ?

mysql select是否会锁表 ?

有的人说mysql的 select 会锁表 ,有的人说 mysql 的查询不会锁表 。
其他他们都对,没有 ,但是很片面。

其实对于mysql的select 是否会锁表 ,这个完全取决于表采用的是什么存储引擎。

这里我就拿大家最熟悉的存储引擎INNODB 和MYISAM 来说明这个问题。

对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。
对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

下面是是我的佐证:

回话一:
 select SQL_NO_CACHE * from tmp002
 表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右

回话二:
 update tmp002
 set num=6
 where MreasonId in (‘700098‘,‘301001‘ ) limit 10000

我们首先 执行以下 回话一的 语句 。 再执行回话二。

我们会发现回话2很快就执行了 
 update tmp002
 set num=6
 where MreasonId in (‘700098‘,‘301001‘ ) limit 10000

受影响的行: 0
时间: 0.120s

在回话三种执行下 show full PROCESSLIST 。
 没有发现任何锁定的现象。

修改表存储引擎:
 alter table tmp002 ENGINE=MYISAM
受影响的行: 5618288
时间: 17.510s

同样是上面的例子

回话一:
 select SQL_NO_CACHE * from tmp002
 表 tmp002  有5618288 数据 存储引擎时INNODB  ,全部查询出来大约需要5min左右

回话二:
 update tmp002
 set num=6
 where MreasonId in (‘700098‘,‘301001‘ ) limit 10000

我们首先 执行以下 回话一的 语句 。 再执行回话二。

我们先回话一直处于执行状态 ,没有返回任何信息 。

在回话三种执行下 show full PROCESSLIST 。
13564441 root 192.168.53.41:53312 tempDB Query 2 Locked  update tmp002 set num=6 where MreasonId in (‘700098‘,‘301001‘ ) limit 10000
13564671 root 192.168.53.41:53736 tempDB Query 4 Writing to net select SQL_NO_CACHE * from tmp002

回话13564441状态为 Locked ,等待锁的释放 。

综上所述,可以得到下面的结果。
对于myisam的表select 是会锁定表的 ,会导致其他操作挂起,处于等待状态。
对于innodb的表select 是不会锁表的。其实这里使用到了快照。快照这里不作讨论。

mysql select是否会锁表 ?

时间: 2024-10-09 14:53:51

mysql select是否会锁表 ?的相关文章

MySQL中select * for update锁表的范围

MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键. 例1: (明确指定主键,并且有此笔资料,row lock) SELECT * FROM products WHERE id='3' F

MySQL中select * for update锁表的问题(转)

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键. 例1: (明确指定主键,并且有此笔资料,row lock) SELECT * FROM products WHERE id='3' FOR UPDATE; SELECT * FROM produc

MySQL中select * for update锁表的范围(转)

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键. 例1: (明确指定主键,并且有此笔资料,row lock) SELECT * FROM products WHERE id='3' FOR UPDATE; SELECT * FROM produc

Mysql InnoDB 数据更新导致锁表

一.数据表结构 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMENT, `feed_id` int(11) DEFAULT NULL , `attach_name` varchar(255) NOT NULL, `cycore_file_id` varchar(255) DEFAULT NULL , `attach_size` bigint(20) NOT NULL DEFAULT '0', `complet

mysql的事务处理与锁表

数据库的事务处理可以保证一组处理结果的正确性.mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能. mysql的事务处理主要有两种方法来实现. 1.用begin,rollback,commit来实现. begin 开始一个事务 rollback 事务回滚 commit 事务确认 Php代码 $conn = mysql_connect('localhost','root','root') or die ("数据

2016年工作中遇到的问题1-10:select-for-update锁表

1.select... for update锁表.注意事项:事务下使用,@Transactional如果用主键,只锁住1行记录如果不用主键,会锁住多条记录,mysql下测试,查询1条,锁住1行,查询2条,锁住2行. 网上不少文章说,没有用主键,会"锁表",似乎不符合事实额.比如,http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537508.html 2.分页跳转的输入框,可以用html5中的input-number.<

【数据库系列】MySql中的select的锁表范围

由于InnoDB预设的是Row-Level Lock,只有明确指定主键的时候MySql才会执行Row lock,否则MySql将会执行Table Lock. 1.明确指定主键则是行锁 2.明确指定主键,若无数据则无锁 3.无主键,table lock 4.主键不明确,table lock 注:MyAsim只支持表级锁,InnerDB支持行级锁,添加了(行级锁/表级锁)锁的数据不能被其他事务再锁定.也不能被其他事务修改.

MySQL行级锁,表级锁,页级锁详解

页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作.如果你是写锁,则其它进程则读也不允许 行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作. 页级,表级锁速度快,但冲突多,行级冲突少,但速度慢.所以取了折衷的页级,一次锁定相邻的一组记录. MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BD

MySQL锁表_LOCK TABLES_UNLOCK TABLES

mysql5.6 参考文档:http://dev.mysql.com/doc/refman/5.6/en/lock-tables.html 锁表和解锁表的基本语法 LOCK TABLES         tbl_name [[AS] alias] lock_type     [, tbl_name [[AS] alias] lock_type] ...      UNLOCK TABLES lock_type:     READ [LOCAL]   | [LOW_PRIORITY] WRITE