Innodb 锁 (简单笔记)

看过很多innodb锁的文章,已经明白的就不写了,简单做个笔记

Innodb 锁的兼容性:

1、意向锁和意向锁之间都是兼容的

2、X(排他锁)与任何锁都是不兼容的

3、排他意向锁 IX 于S锁是不兼容的

4、剩下的锁都是兼容的

三种锁

record lock

gap lock

next-key lock = record + gap

判断锁一定要加上隔离级别,不同级别锁的情况不同

对于Innodb 一般只需要考虑RR 和 RC 隔离级别即可

RR 三种锁

RC 可以认为只有record锁,但是当表存在唯一索引的时候是存在间隙锁(gap lock)只有这一种特殊情况

显示锁 可以是S 或者 X锁

隐式锁只能是X锁

隐式锁的一种理解  begin insert into data  这时候如果没有提交事务,那么该记录应该是隐式锁,当你想要 select * from data for update 时候会锁等待,即等待这个隐式锁。

举例如下:

create table info ( id int primary key , name varchar(20)) engine = innodb;

session1                                                                            session 2

start transaction;

insert into info values (1,‘name‘);

select * from info where id = 1 for update;

session1 提交前都是等待隐式锁

commit;

隐式锁的个人理解就是某个激活的事务要更改一个索引值,这个值即将要改变,那么在另一个事务中要想以这个索引值为条件去更新数据,就需要等待,也就是要给这个被隐式锁锁住的索引加X锁,会LOCK_WAIT

书中有这么一段不是很理解:

drop table if exists a ;
create table a (
            a int primary key,
            b varchar(30)
            ) engine = innodb;
insert into values (1,‘a‘),(2,‘b‘),(3,‘c‘),(4,‘d‘);

两个会话事务:

A:
begin;
select * from a where a= 4 for update;

B:
begin;
select * from a where a <=2 lock in share mode;
delete from a where a = 3;
select * from a where a <=2 lock in share mode;
 

首先执行A,然后执行B中的前两句,当执行到B中第二个select的时候会发现锁等待了

书中解释:SELECT 游标锁定的最大记录被标记为操所是已经加锁成功的。其实导致这个现象的原因是SELECT游标锁定的最大记录被标记为了删除(未被真正PURGE删除),因此,当第二次再次执行select操作的时候,需要进一步锁定记录,也是a等于4的记录,而该记录已经在会话A中被锁定了。

不理解:

应该是A锁定a=4的记录,然后B的第一个select s锁锁定了a<=2的所有记录,delete 时候锁定了a=3的记录,但是delete的语句只是标记了a=3要删除,但是没有实际PURGE,第二个select 为什么要去锁定 a=4呢?

时间: 2024-10-28 11:26:58

Innodb 锁 (简单笔记)的相关文章

MySQL的MyISAM InnoDB 区别简单笔记!

MyISAM InnoDB 区别 一.MYISAM .frm:表结构 .MYD:表数据 .MYI:表索引   二.INNODB .frm:表结构 .idb:表空间 .opt:字符集和排列规则 MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.     M

[转载] 数据库分析手记 —— InnoDB锁机制分析

作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过本文可以帮助大家了解InnoDB锁的基本原理,常见的冲突.死锁,以及对InnoDB事务日志信息的解读. 1. 索引基本原理 InnoDB主要使用行级锁(row lock),其行锁是通过在索引项上加锁而实现的,如果MySQL的执行计划没有用到索引,那么行锁也就无意义了,所以了解锁之前需要了

InnoDB锁机制分析

InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过本文可以帮助大家了解InnoDB锁的基本原理,常见的冲突.死锁,以及对InnoDB事务日志信息的解读. 1. 索引基本原理 InnoDB主要使用行级锁(row lock),其行锁是通过在索引项上加锁而实现的,如果MySQL的执行计划没有用到索引,那么行锁也就无意义了,所以了解锁之前需要了解一点索引原

MySQL- InnoDB锁机制

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题. 背景知识 事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性. 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 一致性

innodb 锁分裂继承与迁移

innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记录之前的间隙 LOCK_INSERT_INTENTION: 插入意向锁,用于insert时检查锁冲突 每个行锁由锁类型和GAP类型组成例如:LOCK_X|LOCK_ORDINARY 表示对记录和记录之前的间隙加排他锁LOCK_S|LOCK_GAP 表示只对记录前的间隙加共享锁 锁的兼容性:值得注意的

applicationContext.xml简单笔记

applicationContext.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://

mybatis-config.xml简单笔记

mybatis-config.xml简单笔记 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <

Innodb 锁系列2 事务锁

上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来介绍,先来介绍下事务锁相关的数据结构 事务锁数据结构 1. 锁模式 /* Basic lock modes */ enum lock_mode { LOCK_IS = 0, /* intention shared */ LOCK_IX, /* intention exclusive */ LOCK_

jQuery的简单笔记

html css javaScript Ajax jQuery Java servlet jsp jdbc mysql oracle struts spring hibernate jdpm tomcat jUnit Ant Hadoop linux unix android sql server jQuery的简单笔记//使用JQuery输出    /*     * jquery对象:需要用"$"来修饰     *      * jquery获取页面标签:$()来包裹,通过"