看过很多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呢?
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

  1. InnoDB锁机制分析

    InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...

  2. MySQL数据恢复和复制对InnoDB锁机制的影响

    MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...

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

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  4. MySQL- InnoDB锁机制

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  5. Android_简单笔记一

    入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...

  6. mysql InnoDB锁等待的查看及分析

    说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...

  7. InnoDB锁问题

    InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我 ...

  8. 【锁】Innodb锁

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...

  9. 由innodb锁引起的数据库相关

    innodb 锁的问题 1.事务 原子性:要么成功,要么失败 一致性:前后数据保持一致状态 隔离性:多个事务并行,相互不影响 持久性:事务提交之后,对数据的影响是永久性的,即使故障也可以保持. 2.并 ...

随机推荐

  1. 捉虫记2:windows程序句柄泄露的上下文环境

    作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...

  2. 到底怎么样才叫看书?——Tony Zhao's

    到底怎么样才叫看书?——上篇 目录: 一.引入 二.经历了就能理解 三.读书要分级 四.只读经典 五.别吝惜你动笔的那点时间 一.引入 看到这个题目的时候你可能会感到有点好笑:“这还用问,看书就是把书 ...

  3. WinAPI——UnhookWindowsHookEx - 卸掉钩子

    UnhookWindowsHookEx(   hhk: HHOOK {钩子句柄} ): BOOL;    {True/False}

  4. Weak Event Patterns

    https://msdn.microsoft.com/en-US/library/aa970850(v=vs.100).aspx In applications, it is possible tha ...

  5. [转] Android自动化测试之MonkeyRunner录制和回放脚本(四)

    测试脚本录制: 方案一: 我们先看看以下monkeyrecoder.py脚本: #Usage: monkeyrunner recorder.py #recorder.py  http://mirror ...

  6. Java数组你知多少?

    下面我带大家一起加深一下对Java数组的认识: 1.理解数组 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化就可以知道. 数组的长度是不变的,一旦 ...

  7. 软件测试Web数据分析工具HttpWatch安装

    1.下载破解版:http://www.pc6.com/softview/SoftView_13845.html 2.安装时引入授权文件并汉化: 3.打开IE9,菜单:管理加载项->工具栏和扩展, ...

  8. Ruby准备工作

    解释性语言,自上而下执行,纯面向对象,跨平台,动态绑定,没有多重继承.NetBeans sun公司开发irb指令可快速实时输入并返回结果 quit 或者exitrdoc hello.rb 生成html ...

  9. 在 ASP.NET MVC4 中使用 NInject

    Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...

  10. BigRender

    当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片的延迟加载.一个庞大 ...