mysql 锁 代码_MySQL中的锁实例

表结构:

id:自增主键,a:无索引,b:普通索引

CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(4) NOT NULL DEFAULT '0',

`b` int(4) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`),

KEY `b` (`b`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

等值查询加锁

主键索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 2 | 1 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> update test set a = 11 where id = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 2;(正常执行)

证明根据主键索引字段加锁查询,会锁住该条数据(记录锁)。

普通索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where b = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 1 | 1 |

| 3 | 3 | 1 |

| 5 | 5 | 1 |

+----+---+---+

3 rows in set (0.00 sec)

窗口B:

mysql> update test set a = 11 where b = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 3;(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(a,b) value(1,1);(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 2;(正常执行)

mysql> insert into test(a,b) value(1,2);(正常执行)

证明根据普通索引字段加锁查询,会锁住符合该条件的所有记录包括不存在的,因此得出锁的是索引,而非数据本身。

无索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where a = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 1 | 1 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> update test set a = 22 where id = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where a = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where b = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where a = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where b = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where id = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(a,b) value(22,22);(被阻塞,等待窗口A中commit后才执行)

证明根据无索引字段加锁查询,会锁住整张表,表现形式类似于表锁。

范围查询加锁

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id > 3 and id < 6 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 5 | 5 | 5 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> insert into test(id,a,b) value(4,4,4);(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(id,a,b) value(6,6,6);(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 77 where id = 7;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 33 where id = 3;(正常执行)

mysql> update test set a = 22 where id=8;(正常执行)

证明锁的范围为**(3,7],既锁住了记录本身(记录锁),也锁住了索引之间的间隙(间隙锁),而且把索引后相邻的两个记录也锁住了(临键锁)**。

通过无索引字段范围查询时,同样是锁住整张表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件属性之r、w、x

r&#xff1a; 对于文件来说&#xff0c;具有读取文件内容的权限&#xff1b;对于目录来说&#xff0c;具有浏览目录内文件的权限 w&#xff1a; 对于文件&#xff0c;具有修改文件内容的权限&#xff1b;对于目录&#xff0c;具有新建、删除、移动、修改文件目录内的权限 …

trie树--详解

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 文章作者&#xff1a;yx_th000 文章来源&#xff1a;Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明&#xff0c;谢谢合作。关键词&#xff1a;trie trie树 数据结构前几天学习了并查集和trie树&am…

yii mysql gii_Yii Gii使用

准备数据库第1步 - 创建一个新的数据库。数据库可以通过以下两种方式进行。在终端运行 mysql -u root –p登录数据后&#xff0c;通过执行 CREATE DATABASE mystudy CHARACTER SET utf8 COLLATE utf8_general_ci; 创建一个新的数据库;第2步 - 在 config/db.php 文件中配置数据库…

通过OracleDataReader来读取BLOB类型的数据 (转载)

通过OracleDataReader来读取BLOB类型的数据 在实际的应用过程中&#xff0c;需要把大块的二进制数据存储在数据库中。读取这些大块的数据&#xff0c;可以通过强制类型转换成为byte数组&#xff0c;但是当这个二进制数据体够大时&#xff08;几十兆或者上百兆&#xff09;&…

PHP简介

PHP原始为Personal Home Page的缩写&#xff0c;已经正式更名为 “PHP: Hypertext Preprocessor”。PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了…

java 事务_Java中事务总结详解(精华)

1.什么是JAVA事务&#xff1f;通常的观念认为&#xff0c;事务仅与数据库相关。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性&#xff1a;表示事务执行过程中的任何失败都…

ellen 纽奥良大学演讲

英 文 中 文 Thank you, President Cowan, Mrs. President Cowen; distinguished guests, undistinguished guests - you know who you are, honored faculty and creepy Spanish teacher. And thank you to all the graduating class of 2009, I realize most of you are hu…

xampp启动Apache端口被占用,修改端口

apache启动端口被占用有可能是80端口被占用&#xff0c;也用可能是443端口被占用。修改这两个端口方法如下&#xff1a; 首先打开xampp&#xff0c;点击下图的config 如果是80端口被占用&#xff0c;选择httpd,conf,会自动打开这个文件&#xff0c;然后在文件里查找80 找到以…

java怎么获取当前日期_JAVA中获取当前系统时间

一. 获取当前系统时间和日期并格式化输出:import java.util.Date;import java.text.SimpleDateFormat;public class NowString {public static void main(String[] args) {SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.o…

Microsoft SharePoint Server 2010 的新增功能

Microsoft SharePoint Server 2010 包括几个关键的增强和新增功能。重新设计的用户界面中的功能区通过将命令放置到更易于导航的基于任务的选项卡上&#xff0c;来帮助您更快地完成工作。可以跨多个 Internet 浏览器工作&#xff0c;例如 Microsoft Internet Explorer 7.0 和 8…

php四种定界符

1.标准风格 <?php//代码 ?>2.短标记风格 <?//代码 ?>默认情况下是不可以这样写的&#xff0c;我们要到php.ini文件里修改一个配置 找到php.ini文件,我用的是xampp,所以就是以他为例&#xff0c;其他找到php.ini文件方法百度一下就知道了 点击Apache的config&…

周易Java_周易API接口_免费数据接口 - 极速数据

package api.jisuapi.zhouyi;import java.net.URLEncoder;import api.util.HttpUtil;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class Search {public static final String APPKEY "your_appkey_here";// 你的appkeypublic static final …

SharePoint SiteCollection 和SubWeb之间的迁移

因为各种不同的原因&#xff0c;项目里可能碰到需要将一个Site Collection迁移为一个子站点的情况。 实现这种需求只能用 内容部署功能中的导出和导入〉 SiteCollectoin to sub web 示例&#xff1a; cd C:\Program Files\Common Files\Microsoft Shared\web server extensions…

php中文乱码问题

访问我的php文件&#xff0c;出现了乱码 解决方法如下&#xff1a; 方法1&#xff1a;加上meta标签&#xff0c;设置字符格式 例如&#xff1a; <?phpecho <meta charset"utf-8">;echo "小河流水人家"; ?>访问就不会乱码了&#xff0c;注…

java 文件转换字符串_java字符串文件互相转换

Java字符串与文件的互转Java中有时候需要读取一个文本类的文件,将其转换为字符串&#xff0c;然后做进一步处理。Java中没有现成的API方法&#xff0c;自己手动实现一个&#xff0c;大家来分享。一、字符串转换为文件/*** 将字符串写入指定文件(当指定的父路径中文件夹不存在时…

使用SQL SERVER 2000的全文检索功能

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 使用SQL SERVER 2000的全文检索功能 步骤&#xff1a; 1、 打开NorthWind数据库&#xff0c;右键Products表&#xff0c;选择“全文索引表”&#xff0c;“在表上定义全文索引”&…

php中的echo、print,print_r、var_dump

我们用代码的运行结果来说明 1、echo <?phpheader(content-type:text/html;charsetutf-8);echo "小河流水人家",<br>;echo 10,<br>;echo true,<br>;echo false,<br>;echo array(8),<br>; ?>运行结果 可以输出字符串和数字…

js数字最多保留两位小数_8085微处理器中最多两个8位数字

js数字最多保留两位小数Problem statement: 问题陈述&#xff1a; To find maximum of two 8bit numberusing 8085 microprocessor. 使用8085微处理器查找最多两个8位数字。 Algorithm: 算法&#xff1a; Load the accumulator with the first data. 向累加器加载第一个数据…

风雨20年:我所积累的20条编程经验 (转)

风雨20年&#xff1a;我所积累的20条编程经验 (转) 编者按&#xff1a;原文作者乔纳森丹尼可&#xff08;Jonathan Danylko&#xff09;是一位自由职业的web架构师和程序员&#xff0c;编程经验已超过20年&#xff0c;涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事…

php的变量、传值、传址、销毁变量

在php中&#xff0c;php的语句需要以**;**结尾&#xff0c;而且变量区分大小写&#xff0c;但关键字不区分大小写 1、变量的命名规则 变量必须以$开头&#xff0c;比如$name&#xff0c;$不是变量名的一部分&#xff0c;仅表示变量名的开始除了$以外&#xff0c;以字母、下划…