MySQL InnoDB 锁表与锁行

由于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 products WHERE id=‘3‘ and type=1 FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock)

复制代码代码如下:

SELECT * FROM products WHERE id=‘-1‘ FOR UPDATE;

例3: (无主键,table lock)

复制代码代码如下:

SELECT * FROM products WHERE name=‘Mouse‘ FOR UPDATE;

例4: (主键不明确,table lock)

复制代码代码如下:

SELECT * FROM products WHERE id<>‘3‘ FOR UPDATE;

例5: (主键不明确,table lock)

复制代码代码如下:

SELECT * FROM products WHERE id LIKE ‘3‘ FOR UPDATE;

注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。

时间: 2024-10-20 00:46:41

MySQL InnoDB 锁表与锁行的相关文章

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

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

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

【转】MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就

Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行          ----使用 commit 或 rollback 命令释放锁 ----Oracle 通过使用 INSERT.UPDATE 和 SELECT-FOR UPDATE 语句自动获取行级锁 SELECT-FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其他用户更新该行 ―可以执行除更新之外的其他操作 ―select * from goods whe

MySQL InnoDB存储引擎之锁

概念: 锁是用来管理对共享文件的并发访问.innodb会在行级别上对数据库上锁.不过innodb存储引擎会在数据库内部其他多个地方使用锁,从而允许对不同资源提供并发访问.例如操作缓冲池中的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入.MyISAM引擎是表锁,而InnoDB提供一致性的非锁定读.行级锁,且行级锁没有相关额外的开销. 锁 table-level locking(表级锁) 整个表被客户锁定.根据锁定的类型,其他客户不能向表中插入记录,甚至从中读数据也受

MySQL中的表级锁

数据的锁主要用来保证数据的一致性,数据库的锁从锁定的粒度上可以分为表级锁,行级锁和页级锁. MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制,比如MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下采用行级锁. 表级锁:开销小,加锁快:不会出现死锁:

如何查询mysql中是否表被锁

可直接在mysql命令行执行:show engine innodb status\G;(只能通过cmd或者shell登录mysql) 查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlist; show status like ‘%lock%’ show OPEN TABLES where In_use > 0; 这个语句记录当前锁表状态 另外可以打开慢查询日志,linux下打开需在my.cnf的[mysqld]里面加上以下内容: slow_query_log=

MySQL: InnoDB的并发控制,锁,事务模型

一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? 通过并发控制保证数据一致性的常见手段有: 锁(Locking) 数据多版本(Multi Versioning) 二.锁 如何使用普通锁保证一致性? 普通锁,被使用最多: (1)操作数据前,锁住,实施互斥,不允许其他的并发任务操作: (2)操作完成后,释放锁,让其他任务执行: 如此这般,来保证一致性.

MySQL InnoDb数据表 自动提交总结

官方文档说明: http://dev.mysql.com/doc/refman/5.5/en/commit.html 1.autocommit仅适用于InnoDb数据表; 2.默认是自动提交,可通过语句查询: select @@autocommit; 3.SET autocommit 禁用或启用默认为当前会话自动提交模式(注意:只是当前会话生效); 4.语法:SET autocommit = {0 | 1}  0为当前会话禁用自动提交,1为当前会话启用自动提交 5.可通过启动服务加命令方式进行修