innodb 引擎 行锁与表锁
行锁与表锁是基于索引来说的(且索引要生效)
不带索引 (表锁)要全表扫描
1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交事务, mysql默认是自动提交
2. set autocommit = 0;设置为不开启自动提交
3. 通过开多个tab窗口模拟不通的session 执行数据库
新建一张person表
窗口1 模拟第一个session
在此窗口先执行设置0,在单独执行update语句
窗口2 模拟第二个session
执行该条语句可以看到 sql一直执行 卡住了,因为它是在等待上一个事务执行完释放表锁
经过一段时间后看到如下结果
这个错跟我们生产上报的错一样,用pinpoint监控的
------------------------------------------------------
执行update 和insert 都是一样的结果 在等待表锁,虽然我操作的不是同一行数据。
如果我把窗口1的事务提交则窗口2会从卡的状态成功执行结束
窗口1的commit;
窗口2的session的则立马执行完毕,
这个场景模拟的是表锁,当session1 拿到表锁后,别的事务的session执行(insert,update,delete) 是拿不到锁的会进行锁等待。
通过命令 看到了当前处于等待的语句
把name字段添加索引(行锁)不用全表扫描直接定位到行 ,使用主键也是用的行锁
添加索引,然后通过执行计划查看索引是生效的
在回到之前的问题,窗口1 再次执行相同的sql 不提交事务,此时执行窗口2
窗口2 直接执行完毕,此时行锁生效,我操作的不是同一行,结果生效了
以上是innodb引擎的表锁 和行锁 ,顺便验证一下默认的事务隔离级别(读已提交的)
开一个窗口3 代表session3
事务执行前
删掉刚才的索引 drop index namex_name on person;
窗口1 执行,当前事务下的结果改变了
窗口3验证 窗口1的事务没提交前 别的事务是读不到这个事务的,如果把窗口1的事务提交 怎窗口3能顺利读取, 这同时说明了2个隔离级别 -----------读已提交的 和不可重读
事务的可串行化可参考:https://blog.csdn.net/nangeali/article/details/75578787 事务内的查询都是带锁的(表锁)
表锁与行锁 以上自己通过数据库执行 直观的验证了一遍,可以看如下这边文章的文字描述来抽象这个验证
参考:https://blog.csdn.net/lz710117239/article/details/71762617
https://blog.csdn.net/u014635472/article/details/79712931 或者 https://www.cnblogs.com/wodebudong/articles/7976474.html
总结: 普通的 曾删改 是表锁,加入索引的曾删改 是行锁,执行 查询是不加任何锁的, 不是有些博客所说的 表锁升级为行锁 。
mysql的innodb 引擎 表锁与行锁的更多相关文章
-
Mysql在InnoDB引擎下索引失效行级锁变表锁案例
先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...
-
三分钟入门 InnoDB 存储引擎中的表锁和行锁
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
-
MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
-
Mysql表锁、行锁、页锁
参考 http://www.jb51.net/article/50047.htm <MySQL行级锁.表级锁.页级锁详细介绍> 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住 ...
-
[转]MySQL 表锁和行锁机制
本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...
-
MySQL 全局锁、表锁以及行锁
1. 系统版本 MySQL 5.7.25 ubuntu 16.04 2. 全局锁 全局锁即对整个数据库实例加锁,使得整个库处于只读状态,会阻塞DML和DDL语句.使用如下命令(简称FTWRL)可为数据 ...
-
MySQL表锁和行锁
锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locki ...
-
MySql中的锁(表锁,行锁)
锁是计算机协调多个进程或春线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU,RAM,I/O)的争用之外,数据也是一种工许多用户共享的资源.如何保证数据并发访问的一致性,有效性是所有数据 ...
-
MySQL的中的全局锁、表级锁、行锁
MySQL的中的全局锁.表级锁.行锁 学习极客时间-林晓彬老师-MySQL实战45讲 学习整理 全局锁 对整个数据库实例加锁.通过使用Flush tables with read lock (FTWR ...
随机推荐
-
蜻蜓FM笔试题目,求两个点的最近父节点
这个博客写的特别好. http://blog.csdn.net/kangroger/article/details/40392925
-
Repeater的分页
Repeater控件是个好东西.轻量级.又好用.完全的自定义.但是,正是因为这些优点它没有自动分页的功能.这个需要研究一下.我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很 ...
-
MVC5_学习笔记_1_CodeFirst
MVC5_EF6_1/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nicolas Hery - ...
-
IO多路复用深入浅出
前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信 ...
-
第一册:lesson forty
原文: Penny's bag. A:Is that bag heavy,Penny? B:Not very. A:Here. Put it on this chair. What's in it? ...
-
CC攻击与DDOS攻击区别
二者的攻击方式主要分为三种:直接攻击.代理攻击.僵尸网络攻击 CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些.这种攻击你见不到虚假IP,见不到特别大的异常流 ...
-
使用SQL Server 2005作业设置定时任务【转】
1.开启SQL Server Agent服务 使用作业需要SQL Agent服务的支持,并且需要设置为自动启动,否则你的作业不会被执行. 以下步骤开启服务:开始-->>>运行--&g ...
-
Large Division(大数)题解
Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...
-
CMD命令操作符
cmd command的缩写,是windows环境下的虚拟DOS窗口,提供有DOS命令,功能强大 mstsc 远程 inetmgr ...
-
android 的AlertDialog对话框
private int selectedFruitIndex = 0; private void showMsg2() {// Dialog alertDialog = new AlertDial ...