第六章:锁

java核心基础 第六章 锁 Java锁的核心概念和原理涉及多个层面,包括语言级别的、库级别的显式锁以及JVM内部的优化机制。锁的正确使用需要开发者对线程模型和资源竞争有深入理解。希望本文对Java锁的深入解析能为读者提供清晰的思路和实践指导。在实际开发中,选择合适的锁类型并优化其使用,将显著提升并发程序的性能和安全性。 阅读详情

锁机制是为了:最大程度利用数据库的并发访问,并确保每个用户以一致性读取和修改数据。

lock和latch

锁

锁的类型

共享锁(s锁),允许事务读一行数据

排他锁(x锁),允许事务删除或者更新一行数据

 对同一行记录锁的兼容性。

多粒度锁:行锁(细粒度),表锁(粗粒度)。

对细粒度对象上锁,先对粗粒度对象上锁。

 

意向锁是表级别的锁,设计目的是为了在下一个事务揭示下一行将被请求的锁的类型。 

意向锁会阻塞全表扫描的请求,不会阻塞其他请求。

 一致性非锁定读

通过MVCC读取当前行的数据。如果当前事务对该行执行update,delete操作,不必等待锁的释放,通过读取锁的快照数据(通过undo段实现)。

在读已提交事务隔离级别下,读取该行最新一份快照数据。

在可重复读事务隔离级别下,读取的是该行事务开始时的行数据版本。

上面的不同是因为read review导致的。

一致性锁定读

对于select事务加上x锁或者s锁。

锁的算法

 Record Lock总是去锁住索引记录,如果没设置索引,InnoDB会对隐式的索引进行锁定。

在唯一索引中

 当查询的索引含有唯一的属性时,InnoDB存储引擎会对next_key lock降级为record_lock,仅锁住索引本身而不是范围。

 在辅助索引中

对于唯一键值的锁定,Next-Key Lock降级为Record Lock仅存在于查询所有的唯一索引列(唯一就是指索引值唯一无重复的,可以直接point查询)。

若唯一索引由多个列组成,而查询仅是查找多个唯一索引列中的其中一个,那么查询其实是range类型查询,而不是point类型查询,故InnoDB存储引擎依然使用Next-Key Lock进行锁定。

解决Phantom Problem

在默认的事务隔离级别下,即REPEATABLE READ 下,InnoDB存储引擎采用Next-Key Locking 机制来避免Phantom Problem (幻像问题即幻读)。

Phantom Problem是指在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。通俗一点:两次查同一范围,查询到的数据数目不同。

解决方案:采用next_key lock对一个范围加上x锁。

 

锁问题

脏读

当前事务可以读到其他事务未提交的数据 

不可重复读

事务两次读同一个数据结果却不一样

和脏读的区别在于,脏读读到的是未提交的数据,不可重复读读到的是其他事务已经提交的数据

一般来说,不可重复读的问题是可以接受的,因为其读到的是已经提交的数据,本身并不会带来很大的问题。数据库事务的默认隔离级别设置为READ COMMITTED,在这种隔离级别下允许公
可重复读的现象。

在InnoDB存储引擎中,通过使用Next-Key Lock算法来避免不可重复读的问题。在MySQL官方文档中将不可重复读的问题定义为Phantom Problem,即幻像问题。在Next-Key Lock算法下,对于索引的扫描,不仅是锁住扫描到的索引,而且还锁住这些索引覆盖的范围(gap)。因此在这个范围内的插入都是不允许的。这样就避免了另外的事务在这个范围内插人数据导致的不可重复读的问题。因此,InnoDB存储引擎的默认事务隔离级别是READREPEATABLE,采用Next-Key Lock算法,避免了不可重复读的现象

丢失更新

一个事务的更新操作会被另外一个事务的更新操作所覆盖。

解决方案:让事务变成串行化,而不是并行化。即两个事务都加上x锁。

阻塞

一个事务中的锁等待另外一个事务释放它所占用的资源。

阻塞并不是坏事,而是为了确保事务可以并发正常进行。

InnoDB引擎大部分情况下不会对异常进行回滚。

死锁

两个或以上的事务在执行过程中因争夺锁资源而互相等待的现象。

最简单方法:将所有等待都回滚事务重新开始。

改进:超时,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。
超时机制虽然简单,但是其仅通过超时后对事务进行回滚的方式来处理,或者说其是根据FIFO的顺序选择回滚对象。但若超时的事务所占权重比较大,如事务操作更新了很多行,占用了较多的undo log,这时采用FIFO的方式,就显得不合适了,因为回滚这个事务的时间相对另一个事务所占用的时间可能会很多。

改进:当前数据库还都普遍采用wait-for graph(等待图)的方式来进行死锁检测。较之超时的解决方案,这是一种更为主动的死锁检测方式。InnoDB存储引擎也采用的这种方式。wait-for graph要求数据库保存以下两种信息:锁的信息链表,事务等待链表
通过上述链表可以构造出--张图,而在这个图中若存在回路,就代表存在死锁.

若存在则有死锁通常来说InnoDB存储引擎选择回滚undo量最小的事务。

死锁分类

如果程序是串行的,不可能产生死锁。死锁只产生在并发情况。

会话A等待会话B,B等待A,叫做AB--BA死锁。

若发现死锁,会回滚一个事务。

另外一种死锁,即当前事务持有了待插入记录的下一个记录的X锁,但是在等待队列中存在一个S锁的请求,则可能会发生死锁。



锁升级

即将当前锁的粒度降低,行锁变页锁,页锁变表锁。为了减小锁的开销。





 

 

深入解析ISO12233标准:SFR算法从理论到代码实现 本文深入解析ISO12233标准中的SFR算法,从理论到代码实现全面介绍如何量化成像系统的解析力。通过e-SFR算法测量边缘扩散函数(ESF)和空间频率响应(SFR),结合光学原理和实际代码示例,帮助开发者准确评估影像质量。文章包含关键步骤的Python实现和工程优化技巧,适用于相机测试、镜头评估等应用场景。 阅读详情

相关推荐

到底是什么决定了二极管的最高工作频率?

硬件工程师,应该都用过二极管的吧,不过也许有一个误区,大多数人可能并不知道,或者说是理解有问题,下面就来细细说下。 一个问题 先提一个问题:到底是什么决定了二极管的最高工作频率? 估计有不少人会回答是二极管反向恢复时间Trr,也有人会说是二极管结电容,那到底谁是对的呢?或者说都一样,反向恢复时间由结电容决定? 到底什么决定了二极管的最高工作频率,我们暂且不论,不过需要知道的是,二极管的反向恢复时间和结电容根本就是两回事,反向恢复时间绝不能等同于结电容的充放电时间。 为什么我这么说呢?.

weixin_42005993的博客 4834

MySQL 死锁后事务无法回滚是真的吗?

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1200人左右 1 + 2 + 3)新人会进入3群MySQL 作为目前互联网企业使用最多的,或者说在基于成本下,最流行的数据库...

sql server的专栏 616

Unity 调用安卓内部安装apk

一、申请权限 应用内安装其他应用的权限属于特殊权限,需要在特殊申请。 Uri packageURI = Uri.parse("package:" + mContext.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); startA...

BDDNH的博客 1240

mysql死锁报错循环_mysql死锁问题

线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。为了更系统的分析问题,本文将从死锁检测、索引隔离级别与锁的关系、死锁成因、问题定位这五个方面来展开讨论。下图为应用日志:1 死锁是怎么被发现的?1.1 死锁成因与检测方法左...

weixin_42515101的博客 531

PX4 Gazebo仿真进阶:自定义飞机模型和地图的完整指南

本文详细介绍了如何在PX4 Gazebo仿真中自定义飞机模型和地图模型,包括文件架构解析、参数调整指南、地图定制技巧及常见问题解决方案。通过实战步骤和性能优化建议,帮助开发者高效完成复杂场景的飞行控制算法测试。

weixin_29081101的博客 386

YOLOv8改进,YOLOv8主干网络替换为FasterNet(全网独发手把手教学,助力涨点)

FasterNet的整体架构由四个分层阶段组成,每个阶段包含一组FasterNet模块,并在前面加一个嵌入或合并层。最后三层用于特征分类。每个FasterNet模块内部,一个PConv层后跟两个PWConv层,为了保持特征多样性并降低延迟,归一化和激活层仅在中间层之后进行,其中,PConv 是一种快速高效的卷积操作,通过仅对部分输入通道应用卷积滤波器,而保持其余通道不变,从而减少了计算量和内存访问。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2016

InnoDB存储引擎中的各种锁

什么是锁 现实生活中的锁是为了保护你的私有物品,在数据库中锁是为了解决资源争抢的问题,锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访。 数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性 InnoDB存储引擎区别于MyISAM的两个重要特征就是:InnoDB存储引擎支持事务和行级别的锁,MyISAM只支持表级别的锁 InnoDB存储引擎中的锁 InnoDB存储引擎实现了如下两种标准的行级锁: 共享锁(S Lock),允许事务读一行数据 排他锁(X Lo

果子爸聊技术 1万+

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

MySQL:多个事务更新同一行数据时,通过加行锁避免脏写的

引入 多个事务并发运行的时候,如果同时要读写一批数据,此时读和写事件的关系需要协调好,否则可能会有脏读、不可重复读、幻读等一系列问题 简单来说,脏读、不可重复读、幻读,都是别人在更新数据的时候,你怎么读的问题,读的不对,那就有问题 ,读的方法对了,那就不存在问题了。 那怎么协调呢?这就要靠基于undo log版本链条以及ReadView实现的MVCC机制了 如果有多个事务同时并发更新一行数据的时候,会有脏写的问题,而脏写是绝对不允许的,那么这个脏写要靠怎么防止呢? 解决方法 说白了,就是靠锁机制,依

OceanStar的博客 1万+

建模simulink - 手把手教你搭建xpc平台

概述xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件...

不只会拍照的程序猿 7088

复现论文《大规模风电场电磁暂态高效建模仿真方法》

本文提出了一种针对大规模风电场电磁暂态(EMT)仿真的高效建模方法。通过三种关键技术实现仿真加速:(1)永磁直驱风电机组一体化等效建模,采用节点导纳矩阵降维将25节点机组简化为4端子电路,仿真速度提升1-3个数量级;(2)基于戴维南/诺顿等效和OpenMP并行计算的风电场整体建模,通过串并联叠加实现节点收缩,30台机组仿真加速近万倍;(3)受控源映射解耦方法提高故障仿真灵活性。复现代码展示了核心算法实现,包括导纳矩阵Schur补降维、多进程并行计算框架以及受控源解耦方法。

huanghm88的专栏 279

深入理解Mysql事务隔离级别与锁机制

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的 脏写、脏读、不可重复读、幻读 这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机 制、MVCC多版本并发控制隔离机制 ,用一整套机制来 解决多事务并发问题。

weixin_43064364的博客 1140

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

第六章-锁

一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据,因此出现了锁(locking)机制。 6.1 什么是锁 249 锁是数据库系统区别于文件系统的一个关键特性。数据库系统使用锁是为了支持对共享资源(注意是共享资源,不单单指行记录)进行并发访问,提供数据的完整性和一致性。 有多少种数据库,就可能有多少种锁的实现方法。用户可能对某个特定的关系数据库系统的锁定...

营长的博客 244

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【JUC2022】第六章 Synchronized 与锁升级

【JUC2022】第六章 Synchronized 与锁升级

2022年毕业的萌新程序猿,输出一下自己的学习内容~ 500

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MYSQL复习——第六章:锁

6.1 锁 锁的类型(从粒度分类) 行锁(都是悲观锁) 共享锁(S Lock):读锁 排他锁(X Lock):写锁 表锁:Innodb意向锁 意向共享锁(IS Lock):事务打算给数据行加行共享锁,事务在给一个数据行加锁前必须获得该表的IS锁 意向排他锁(IX Lock):事务打算给数据行加行排他锁,事务在给一个数据行加锁前必须获得该表的IX锁 页锁 锁的算法(Innodb) Record Lock:单个行记录上锁 Gap Lock:间隙锁,锁范围.

qq_41157876的博客 295

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【2019秋冬】【MySQL】MySQL技术内幕 第六章 锁

锁用于管理对共享资源的并发访问 不同的存储引擎有不同的锁机制 latch&lock latch 是轻量级的锁,时间短,线程锁。在InnoDB中可分为互斥锁和读写锁,用来保证并发线程操作临界资源的正确性,没有死锁检测 lock是事务锁,锁定数据库中的对象,例如表,页,行。lock仅在事务commit或rollback后释放,有死锁机制 InnoDB中锁的类型 共享锁 S锁 读取行数据 排他锁...

咸鱼之井的博客 236

第六章 Java多线程--锁--锁的分类

Java并发编程中锁是用于控制多线程对共享资源访问的重要机制。在Java中,有几种不同的锁机制可以使用,从低级的java.lang.Object类中的synchronized关键字到更高级的java.util.concurrent.locks包中的Lock接口和其实现。

Lin_Miao_09的博客 888

第六章 基于锁的并发数据结构设计

第六章 基于锁的并发数据结构设计6.1 为并发设计的意义何在?6.1.1 数据结构并发设计的指导与建议(指南)6.2 基于锁设计更加复杂的数据结构编写一个使用锁的线程安全查询表 6.1 为并发设计的意义何在? 设计并发数据结构,意味着多个线程可以并发的访问这个数据结构,线程可对这个数据结构做相同或不同的操作,并且每一个线程都能在自己的自治域中看到该数据结构 在互斥量的保护下,同一时间内只有一个线...

Echo_dia的博客 465

第六章 InnoDB存储引擎——锁

这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放。lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。解决死锁问题最简单的一种方法是超时:即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。Phantom Problem是指:在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。

vvstormhao的博客 279

Java并发编程 第六章 共享模型之无锁

1000个线程,每个取10元,共一万,没加锁毫无疑问并发运行出错。方法加锁后正常输出了。

m0_56369671的博客 1472

JUC并发编程高级篇第六章之Synchronized锁升级(无锁->偏向锁->自旋锁->重量锁)

先说好结论 ,全文都要都是围绕这几点进行分析的,看不得懂得可以看后面的分析讲解锁对象锁指向偏向锁MarkWord存储的是偏向线程的ID轻量锁MarkWord存储的是线程栈中的LockRecord指针重量锁MarkWord存储是指向堆中的monitor对象的指针。

qq_42292373的博客 661

第六章 共享模型之 无锁

AtomicInteger . compareAndSet( ) 方法的工作方式

无奈朝来寒雨晚来风 的博客 645

InnoDB-----第六章 锁

第6章 锁 文章目录第6章 锁@[toc]1. 什么是锁2. lock与latch3. InnoDB存储引擎中的锁(1). 锁的类型(2). 一致性非锁定读(3). 一致性锁定读(4). 自增长与锁(5). 外键和锁4. 锁的算法(1). 行锁的三种算法5. 锁问题(1). 脏读(2). 不可重复读(3). 幻读6. 阻塞7. 死锁(1). 死锁的概念(2). 死锁概论8. 锁升级 ​ 锁的出...

Benjalin_76_84的博客 606

第六章 设计基于锁的并发数据结构

要求栈的用户负责确保这一点。此外,通过在pop()函数中直接返回弹出的数据项,而不是通过分开的top()和pop()操作,可以进一步避免潜在的竞争条件。try_pop() 处理的是队列的头部,而 push() 处理的是尾部,两者不会冲突,因此可以避免使用全局互斥锁。对于列表中的每个节点 x,其中 x 不等于 tail,x->data 指向类型 T 的一个实例,x->next 指向列表中的下一个节点。如果遵循简单的线程安全准则,比如不返回引用,并在每个成员函数中放置一个简单的互斥锁,所有这些操作都是安全的。

老毛的博客 416

读《MySQL技术内幕 InnoDB存储引擎》 学习总结 第六章 锁

6.1 什么是锁 用于管理对共享资源的并发访问。提供数据的完整性与一致性。 6.2 lock与latch latch又称为闩锁,是轻量级锁。又可分为mutex和rwlock。其目的是用来保证并发线程操作临街资源的正确性并且没有死锁检测机制。 lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。 6.3 InnoDB存储引擎中的锁 锁的类型 行级锁 共享锁:S 允许事务读...

lvzi的博客 172
上一篇: MySQL锁
下一篇: 我们都是小青蛙文章------锁
叮叮咚咚666666
博客等级 码龄6年 13粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值