(Mysql 七)InnoDB引擎的行锁和表锁

原创 2017年02月22日 00:32:01

mysql常用引擎有MYISAM和InnoDB,而InnoDB是mysql默认的引擎。MYISAM不支持行锁,而InnoDB支持行锁和表锁。


1.行锁和表锁

2.行锁的类型

3.行锁的实现



1.行锁和表锁

在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,

行锁则无法实现,取而代之的是表锁。


表锁不会出现死锁,发生锁冲突几率高,并发低。

行锁:会出现死锁,发生锁冲突几率低,并发高。


锁冲突:例如说事务A将某几行上锁后,事务B又对其上锁,锁不能共存否则会出现锁冲突。(但是共享锁可以共存,共享锁和排它锁不能共存,排它锁和排他锁也不可以)

死锁:例如说两个事务,事务A锁住了1~5行,同时事务B锁住了6~10行,此时事务A请求锁住6~10行,就会阻塞直到事务B施放6~10行的锁,而随后事务B又请求锁住1~5行,事务B也阻塞直到事务A释放1~5行的锁。死锁发生时,会产生Deadlock错误。


锁是对表操作的,所以自然锁住全表的表锁就不会出现死锁。


2.行锁的类型

行锁分 共享锁 和 排它锁。

共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。

排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。包括写锁。


上共享锁的写法:lock in share mode

例如: select  math from zje where math>60 lock in share mode;


上排它锁的写法:for update

例如:select math from zje where math >60 for update;


3.行锁的实现

注意几点:

1.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。

2.两个事务不能锁同一个索引,例如:

事务A先执行:
select math from zje where math>60 for update;

事务B再执行:
select math from zje where math<60 for update;
这样的话,事务B是会阻塞的。如果事务B把 math索引换成其他索引就不会阻塞,但注意,换成其他索引锁住的行不能和math索引锁住的行有重复。
3.insert ,delete , update在事务中都会自动默认加上排它锁。

实现:

会话1:
begin;
select  math  from zje where math>60 for update;

会话2:

begin;
update zje set math=99 where math=68;
阻塞...........
会话相当与用户

如上,会话1先把zje表中math>60的行上排它锁。然后会话2试图把math=68的行进行修改,math=68处于math>60中,所以是已经被锁的,会话2进行操作时,

就会阻塞,等待会话1把锁释放。当commit时或者程序结束时,会释放锁。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014453898/article/details/56068841

MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制。比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁...
  • hsd2012
  • hsd2012
  • 2016-04-10 17:23:10
  • 11320

Mysql中那些锁机制之InnoDB

Mysql中那些锁机制之InnoDB http://www.2cto.com/database/201508/429967.html 我们知道mysql在以前,存储引擎默认是MyISAM,但是随...
  • zhanghongzheng3213
  • zhanghongzheng3213
  • 2016-06-20 16:51:36
  • 6012

MySQL——InnoDB行锁

1、InnoDB行锁是通过给索引上的索引项加锁实现的,如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录加锁。 简单地说:如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际...
  • hjw1991324
  • hjw1991324
  • 2016-05-16 14:16:21
  • 1302

MYSQL Innodb 锁行还是锁表问题探讨

关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况。为什么呢?先看一下这篇文章。        做项目时由于业务...
  • zmx729618
  • zmx729618
  • 2016-06-21 17:16:30
  • 4919

MySQL——InnoDB锁问题(六)

一、在InnoDB情况下什么时候使用表锁。 对于InnoDB表,大多数情况都应该使用行锁,因为事务和行锁往往是我们选择InnoDB表的重要原因。但在特殊的情况下,也可以使用表级锁。 (1)、事务需...
  • spring_model
  • spring_model
  • 2017-01-04 17:51:54
  • 888

InnoDB行锁、事务还有死锁

InnoDB行锁有3种实现 1.record lock,锁住单行记录 2.gap lock,我们熟知的间隙锁,会锁住一个范围,但不包含记录本身 3.next -key lock,前两种锁的联合使...
  • qq_22912803
  • qq_22912803
  • 2016-08-21 16:28:38
  • 748

Mysql InnoDB行锁实现方式

Mysql InnoDB行锁实现方式   InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB...
  • weikeke410
  • weikeke410
  • 2016-06-20 20:37:58
  • 139

MySQL——InnoDB锁问题(三)

一、InnoDB行锁模式和加锁方法。 InnoDB表实现了以下两种形式的行锁。 (1)共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 (2)排他锁(X):允许获得排他锁...
  • spring_model
  • spring_model
  • 2017-01-04 14:48:07
  • 324

关于MYSQL Innodb 锁行还是锁表

关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况。为什么呢?先看一下这篇文章。   做项目时由于业务...
  • skiof007
  • skiof007
  • 2015-12-11 14:37:10
  • 1635

mysql innodb的行级锁和表锁

我们一般认为mysql innodb不是行级锁吗? 怎么会把整个表锁死? 什么情况会使Innodb锁表呢? 要实现行级锁, 需要考虑一个问题, 如何才能 判定 一行正在被使用?mysql使用索引...
  • liuzp111
  • liuzp111
  • 2016-03-30 14:43:35
  • 3065
收藏助手
不良信息举报
您举报文章:(Mysql 七)InnoDB引擎的行锁和表锁
举报原因:
原因补充:

(最多只允许输入30个字)