MySQL - 锁

一、什么是锁

锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。

 


二、MySQL 不同存储引擎支持的锁机制

 

存储引擎支持的锁类型
Myisam表锁
Innodb行锁、表锁
Memory表锁
BDB页锁、表锁

 
表锁:直接锁住的是一个表,开销小,加锁快,不会出现死锁的情况,锁定粒度大,发生锁冲突的概率更高,应对并发能力最低。(因为加锁了,所以经常需要等待)

行锁:直接锁住的是一条记录,开销大,加锁慢,发生锁冲突的概率较低,应对并发能力很高。

页锁:锁住的一个页面,在 InnoDB 中一个页面为16KB,它的开销介于表级锁和行级锁中间,也可能会出现死锁,锁定粒度也介于表级锁和行级锁中间,应对并发能力介于表级锁和行级锁中间。

 


 三、InnoDB 存储引擎中的锁

InnoDB 支持的是行级锁和表级锁。但是 InnoDB 实际上是实现了 6 种锁。

1、实现了两种标准的** 行级锁**,分别是 **共享锁、排他锁**。

2、实现了两种标准的** 表级锁**,分别是 **意向共享锁、意向排他锁**。

3、实现了两种抽象的锁,乐观锁、悲观锁。(这两种锁并不是真实存在的)

 

 
 四、InnoDB 存储引擎中 各种锁的加锁示例

1、加共享锁示例:

-- 事务 T1
BEGIN;
START TRANSACTION;
select * from user where id = 1 LOCK IN SHARE MODE;-- COMMIT;
-- 事务 T2-- 不加锁的查询 (可以查询到)
-- SELECT * from user where id = 1;-- 不加锁的更新 (不可以更新)
-- UPDATE `user` set age = 29 where id = 1;-- 加共享锁的查询 (可以查询到)
-- SELECT * from user WHERE id = 1 LOCK IN SHARE MODE;-- 加排他锁的查询 (不可以查询)
-- SELECT * from user WHERE id = 1 FOR UPDATE;

如果在事务 T1 中对行记录加了共享锁,那么其他事务 T2,不论加没加锁,都不能更新,直到事务 T1 释放锁。

如果在事务 T1 中对行记录加了共享锁,事务 T2 是没有加锁的查询,或者加的是共享锁的查询,则可以查询到结果。

如果在事务 T1 中对行记录加了共享锁,事务 T2 是加了排它锁的查询,则暂时不能查询,直到事务 T1 释放锁。
 

 
2、加排他锁示例

-- 事务T1
BEGIN;
START TRANSACTION;
select * from user where id = 1 FOR UPDATE;COMMIT;
-- 事务 T2-- 不加锁的查询 (可以查询到)
-- SELECT * from user where id = 1;-- 不加锁的更新 (不可以更新)
-- UPDATE `user` set age = 29 where id = 1;-- 加共享锁的查询 (不可以查询到)
-- SELECT * from user WHERE id = 1 LOCK IN SHARE MODE;-- 加排他锁的查询 (不可以查询到)
-- SELECT * from user WHERE id = 1 FOR UPDATE;

  如果在事务 T1 中对行记录加了排他锁,那么其他事务T2,如果是不加锁的查询,是可以查询到结果的,但如果是加锁的查询或更新,则不允许操作,直到事务 T1 释放锁。

注:凡是更新、删除、插入操作,Mysql都会默认给这个操作加上排他锁,所以这里只演示查询操作的。

 
3、加意向共享锁

  对一个数据行加共享锁(S),首先 InnoDB 会先找到这张表,对该表加意向共享锁(IS)之后,再对该数据行添加共享锁。意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预。

 
4、加意向排他锁

  对一个数据行加排他锁(X),首先 InnoDB 会先找到这张表,对该表加意向排他锁(IX)之后,再对该数据行添加排它锁。意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预。

 
5、关于乐观锁和悲观锁的说明

乐观锁和悲观锁并不是真实存在的锁,它们只是抽象出来的,对锁的使用情况的描述。


6、悲观锁 *

  悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update 操作来实现悲观锁。

 
7、乐观锁

  乐观锁的特点是先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。

 
 

原文链接:https://www.haveyb.com/article/63

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

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

相关文章

数据库时区那些事儿 - MySQL的时区处理

原文地址 当JVM时区和数据库时区不一致的时候,会发生什么?这个问题也许你从来没有注意过,但是当把Java程序容器化的时候,问题就浮现出来了,因为目前几乎所有的Docker Image的时区都是UTC。本文探究了MySQL及其JDBC驱动…

java_函数的重载

函数的重载(Overload)概念:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。函数功能一样,仅仅是参与运算的未知内同不同时,可以定义多函数,却使…

全新升级的AOP框架Dora.Interception[2]: 基于约定的拦截器定义方式

Dora.Interception(github地址,觉得不错不妨给一颗星)有别于其他AOP框架的最大的一个特点就是采用针对“约定”的拦截器定义方式。如果我们为拦截器定义了一个接口或者基类,那么拦截方法将失去任意注册依赖服务的灵活性。除此之外…

redis watch使用场景_redis不得不会的事务玩法

我们都知道redis追求的是简单,快速,高效,在这种情况下也就拒绝了支持window平台,学sqlserver的时候,我们知道事务还算是个比较复杂的东西,所以这吊毛要是照搬到redis中去,理所当然redis就不是那…

加快Android Studio的编译速度

从Eclipse切换到Android Studio后,感觉Android Studio的build速度比Eclipse慢很多,以下几个方法可以提高Android Studio的编译速度使用Gradle 2.4Gradle 2.4对执行性能有很大的优化,但Android Studio现在默认使用的是Gradle 2.2,所以我们需要…

开发中 MySQL 规范

一、建表规范 1、数据库名、表名、字段名必须使用小写字母或数字,并且禁止以数字开头 示例:goods_category、agent_operate_201812_log 2、数据库名、表名、字段名要做到见名识意 示例:goods_category,不能 gc 3、配置表建议以 …

PaddleOCR在 Linux下的webAPI部署方案

很多小伙伴在使用OCR时都希望能采用API的方式调用,这样就可以跨端跨平台了。本文将介绍一种基于python的PaddleOCR识别WebAPI部署方案。喜欢的可以关注公众号,获取更多内容。一、 Linux环境下部署1.环境要求操作系统:CenterOS7;主…

影响程序员生涯的三个错误观念,你千万不要犯!

程序员在社会上,到底是怎样一个生活群体?是否能找到自己方向?其实,路一直都在那里,只是你看不到而已! 当初的你,可能一直被一些技术牵着鼻子走,并不是自己在做着自己想做的&#xff…

心电图计算心率公式_心电图到底能反应啥问题,看过之后你也能当“医生”

只要是经历过健康体检的健康人,或者做过手术的患者,基本都做过心电图检查。都说久病成医,所以有些人对血、尿常规等各项检查的结果都门清儿得很,最起码看一眼也能说出个大概齐。偏偏心电图这种常做的检查,不但老病号如…

获取正在运行的服务

手机上安装的App,在后台运行着很多不同功能的服务,最常见的例如消息推送相关的服务。如何查看这些服务?如何判断某个服务是否正在运行?如何停止某一个服务呢?请看下面的方法: package com.example.servicel…

openstack的vnc启动ssl

1、制作ssl证书# cd /etc/pki/tls/certs [rootwww certs]# make vnc.key Enter pass phrase:# 输入密码 Verifying - Enter pass phrase:#确认# 从private key 中删除密码# openssl rsa -in vnc.key -out vnc.key # make vnc.csr Country Name (2 letter code) [XX]:CN# 国家 S…

开发composer包

一、初始化&#xff08;生成composer.json文件&#xff09; composer init#输入你要创建的composer包项目命名空间 Package name (<vendor>/<name>) [root/tiny-laravel]: #haveyb/tiny-laravel #输入composer包的描述 Description []:#this is a tiny laravel h…

Linux本地yum源配置以及使用yum源安装gcc编译环境

本文档是图文安装本地yum源的教程&#xff0c;以安装gcc编译环境为例。 适用范围&#xff1a;所有的cetos,红帽,fedroa版本 适用人群&#xff1a;有一点linux基础的小白 范例系统版本&#xff1a;CentOS Linux release 7.3.1611 (Core) 范例环境&#xff1a;vmware 虚拟机 安装…

word如何设置上标形式_如何在word中设置特殊页码

获取更多业界资讯和深度好文● 点击蓝字关注我们 ●在日常工作中&#xff0c;我们编辑的word文档经常需要设置页码&#xff0c;但有时文档的第一页是封面&#xff0c;第二页才是正文&#xff0c;或者第二页是目录&#xff0c;第三页才是正文&#xff0c;如下图所示&#xff0c;…

[cf797c]Minimal string(贪心+模拟)

题意&#xff1a; 给出了字符串s的内容&#xff0c;字符串t&#xff0c;u初始默认为空&#xff0c;允许做两种操作&#xff1a; 1、把s字符串第一个字符转移到t字符串最后 2、把t字符串最后一个字符转移到u字符串最后 最后要求s、t字符串都为空&#xff0c;问u字符串字典序最小…

发布composer包到 Packagist,并设置自动同步(从github到Packagist)

一、发布composer包 1、将我们写好的项目包发布到github上 这一步不赘述&#xff0c;应该都会。 但是需要注意的是&#xff0c;我们一定要为我们的项目包打上tag之后再提交&#xff0c;否则 我们composer require时可能会报错 Could not find a version of package。 # 设置…

教你在CorelDRAW中导入位图

在CorelDRAW软件中不能直接打开位图图像&#xff0c;在实际操作中&#xff0c;用户需要使用导入位图图像的方法进行操作。导入位图图像时&#xff0c;可以导入整幅图像&#xff0c;也可以在导入的过程中对图像进行裁剪&#xff0c;或重新取样图像&#xff0c;导入整幅位图图像时…

.NET 6 中将 ASP.NET Core 注册成 Windows Service

前言使用 Visual Studio 中的 Worker Service项目模板:我们很容易创建出 Windows Service&#xff1a;IHost host Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices(services >{services.AddHostedService<Worker>();}).Build();await host.R…

19.12 添加自定义监控项目 配置邮件告警 测试告警

9月12日任务19.12 添加自定义监控项目19.13/19.14 配置邮件告警19.15 测试告警19.16 不发邮件的问题处理19.12 添加自定义监控项目需求&#xff1a;监控某台web的80端口连接数&#xff0c;并出图两步&#xff1a;1&#xff09;zabbix监控中心创建监控项目&#xff1b;2&#xf…

wab框架

http协议 一、http简介 1.HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#xff09;。 2.HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0…