数据库锁的概念与介绍

数据库篇——锁 在为数据行加共享 / 排他锁之前,InooDB 会先获取该数据行 所在数据表的对应意向锁。 阅读详情

数据库锁

锁的分类(使用方式划分)

悲观锁与乐观锁

悲观锁(Pessimistic Lock)

具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。传统的关系型数据库很多用到这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁。

排他锁(Exclusive Lock)

X锁,写锁,表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁。

  1. 仅允许一个事务封锁此页,其他任何事务必须等到排他锁被释放才能对该页进行访问;
  2. 排他锁一直到事务结束才能被释放
举个栗子
update table set name='h' where id='1'
update table set age='1' where id='2'

假设两个语句同时执行,前者在执行时就会给table加上X锁,那么后者执行时也想加上X锁,只是不允许的,所有必须等前者执行完,后者才能执行。

共享锁(Share Lock)

S锁,读锁,用于所有的只读数据操作。共享锁是非独占的,允许其他事务读取其锁定的资源。

  1. 因为是非独占的,所有允许多个事务可封锁同一个共享页,一个锁可以同时被多个线程拥有,任何事务都不能修改;
  2. 通常是该页被读取完毕,S锁立即被释放。
举个栗子
select  * from table
select  * from table

假设两个语句同时执行,同样前者在执行时会加S锁,但是他允许多个事务读取,所以后者也能执行,而不需要等待,但是若后者是update table set name='h' where id='1',想在table中加排他锁,那么这就是不允许的了,因为S锁只允许读取,而不允许修改。

更新锁(Update Lock)

U锁,为解决死锁,引入更新锁。更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁 (用来更新)的资格”。

  1. 用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;
  2. 当被读取的页要被更新时,则升级为X锁;
  3. U锁一直到事务结束时才能被释放。
乐观锁(Optimistic Lock)

认为一般情况下数据不会造成冲突,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号、时间戳等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

版本号
  1. 为表中加一个 version 字段,当读取数据时,连同这个 version 字段一起读出;
  2. 数据每更新一次就将此值加一,当提交更新时,判断数据库表中对应记录的当前版本号是否与之前取出来的版本号一致,如果一致则可以直接更新,如果不一致则表示是过期数据需要重试或者做其它操作。
时间戳

跟版本号的原理其实类似,也是在表中添加一个 timestamp 的时间戳字段,然后提交更新时判断数据库中对应记录的当前时间戳是否与之前取出来的时间戳一致,一致就更新,不一致就重试。

引用实例
如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过 程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作 员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。  
乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本 ( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。  
读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。  
对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。  
1 操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50( $100-$50 )。  
2 在操作员 A 操作的过程中,操作员B 也读入此用户信息( version=1 ),并从其帐户余额中扣除 $20 ( $100-$20 )。  
3 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。  
4 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须大于记录当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。  
这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作员A 的操作结果的可能。
锁粒度控制

如上所说,其实加各种锁都是为了保证在读取或修改数据中尽可能的不出现问题,然而加锁本身就会带来一些问题,加锁也需要消耗资源,锁的各种操作,包括获得锁、检查锁是否已经解除、释放锁等,都会增加系统的开销,影响系统的性能,我们要做的就是在锁的开销与数据的安全性中寻找最优解。

表级锁

锁定整个表,表锁时Mysql中最基本的锁策略,也是开销最小的,加锁快,无死锁。而他的劣势就是发生冲突的概率高,而且处理并发问题的能力低。
加锁的方式:

  1. 自动加锁,查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。
  2. 显示加锁,如lock table tableName read;。
页级锁

页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁,优缺点相对于表锁和行锁也是折中的。页级锁仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。

行级锁

锁定某一行数据,行锁的开销大,加锁慢,并且会出现死锁;但是他的锁的粒度小,发生锁冲突的概率低,处理并发的能力强,并且在事务回滚时能减少改变的数据。
加锁的方式:

  1. 自动加锁,对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁。
  2. 显示加锁,如select * from tableName where id = '1' for update;。
数据库事务
四大特性
  1. 原子性(Atomicity)
    原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
  2. 一致性(Consistency)
    一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  3. 隔离性(Isolation)
    隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  4. 持久性(Durability)
    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
隔离级别
  1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
    这种隔离级别会产生脏读,不可重复读和幻像读。
  2. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
  3. ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
    它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  4. ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
    除了防止脏读,不可重复读外,还避免了幻像读。
分布式事务

分布式事务太过庞大,后期再写吧。

数据异常
丢失更新

若两个事务同时对一个字段进行更新,两个不同事务同时获得数据,然后在各自事务中同时修改了该数据,那么先提交的事务做的更新会被后提交事务的更新覆盖,这就造成了丢失更新。

脏读

若事务A正在对某个字段进行更新,同时事务B读取这个更新后的字段,并读取成功,然而事务A后面又做了回滚,那么这就产生了脏读。

不可重复读

一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果不一样,那么就是产生了不可重复读。利用脏读的例子,若事务A回滚后事务B又执行了一次,那么很明显事务B两次读到的结果是不一致的。

幻读

执行某个查询操作时,事务A读的时候读出了4条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 5 条,就产生了幻读。

与君共勉!!

第69讲:MySQL数据库中锁的概念以及分类 锁是计算机协调多个进程或者线程并发访问同一个资源时的限制机制,进程和线程对同一个资源的并发访问都有着限制机制,那么MySQL数据库对于数据被多个用户同时共享的情况下,为了保证数据的一致性,从而有了锁的概念。在数据库中,除了传统的计算资源(CPU、RAM、I/O)的争用之外,表中的数据也是被多用户并发共享的资源,只要是并发共享访问的资源都会有一定的限制,在多用户并发访问同一个数据时,为了保证数据的一致性、有效性,就需要用到锁的概念。锁对于数据库而言是非常重要的,也是非常复杂的。 阅读详情

相关推荐

Linux基础——“C语言高级编程” C语言中的细节你真的知道吗?

文章目录GCC简介 GCC简介 gcc 所支持后缀名解释 .c c原始程序 .C / .cc /.cxx C++原始程

weixin_44278698的博客 2511

数据库锁全集

你还不知道数据库有哪些锁吗?还不知道mysql锁使用场景吗?

LQ19900221的博客 3694

深入解析Sigma Delta调制器 —— 从电流采样到数字信号处理的完整链路

本文深入解析了Sigma Delta调制器的工作原理与应用。通过剖析过采样、噪声整形与负反馈核心机制,并结合AMC1306等实例,详细阐述了从电流采样到数字信号处理的完整链路。该技术凭借其高精度和高抗干扰能力,在ADC、电流测量及音频处理等领域发挥着关键作用。

ttt77的博客 643

什么是数据库锁(Lock)?有哪些类型的锁

数据库锁是一种机制,用于协调多个并发事务对数据库中数据的访问。当多个事务同时尝试对相同的数据进行读取或写入操作时,可能会引发数据一致性问题。数据库锁通过限制并发事务的操作,以确保数据的完整性和一致性。共享锁(Shared Lock):也称为读锁。允许多个事务同时获取共享锁,以进行读取操作。共享锁之间不会互斥,允许并发读取。但是,共享锁与排他锁之间互斥,一个事务持有共享锁时,其他事务无法获得排他锁。排他锁(Exclusive Lock):也称为写锁。排他锁是互斥的,只允许一个事务持有。

stormjun的博客 6738

CS231n+assignment2(一)

cs231n作业二详解+代码

qq_56551150的博客 2411

Android 13 RK3588 编译烧写实录全程

本文详细记录了RK3588主板在Android 13系统下的各项功能测试与编译过程。主要内容包括:1)网络功能测试(以太网、WiFi、蓝牙连接);2)外设接口测试(耳机、麦克风、USB、TF卡);3)硬件功能验证(RTC时钟、ADC采样、MIPI摄像头);4)系统设置(手势导航、开发者选项);5)Android 13 SDK编译环境搭建与源码获取方法。通过图文并茂的方式展示了各功能的配置方法、操作步骤和测试结果,为开发者提供了全面的参考指南。

hnjzfwy的博客 239

数据库中的锁

暂无

ZackNing的博客 1528

【嵌入式硬件】DRV8874电机驱动

1)N沟道H桥电机驱动;2)驱动1个双向有刷直流电机;3)2个单向有刷直流电机;4)4.5V-37V工作电压范围;5)集成电流感测和调节;6)成比例电流输出(IPROPI);7)可选电流调节(IMODE):逐周期或固定关断时间;8)支持1.8、3V、5V逻辑输入;9)集成保护:欠压、电荷泵欠压、过流保护、输出关闭、热关断、自动故障恢复。

qq_39200110的博客 4423

MySQL数据库的锁详解

目录悲观锁悲观锁按使用性质分类共享锁(S锁)排他锁(X锁)更新锁(U锁)悲观锁按作用范围分类(按锁的粒度分类)行锁表锁悲观锁的实现乐观锁乐观锁的实现版本号时间戳待更新字段所有字段悲观锁的优缺点乐观锁的优缺点乐观锁与悲观锁的选择 数据库锁的种类一般分为两种:一种是悲观锁,一种乐观锁。 悲观锁 悲观锁(Pessimistic Lock)具有强烈的独占和排他特性,它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制。传统的关系数据库里用到了很

TABE_的博客 1万+

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1247

14 硬件工程师笔面试高频考点真题解析——逻辑门

逻辑门是数字电路的基本单元,实现布尔运算(如与、或、非、异或等)。OC门(集电极开路)和OD门(漏极开路)需外接上拉电阻,支持“线与”逻辑,适用于I2C总线等场景,避免推挽输出并联导致的短路问题。三态门具有高、低、高阻三种状态,用于总线分时复用。推挽输出因内置上下管,禁止并联,否则会引发电源短路。三者区别在于:推挽驱动强但不可并联;OC/OD需上拉,支持线与;三态门通过使能控制实现高阻隔离,适用于共享总线设计。

XU157303764的博客 1902

数据库锁的概念的讲解

什么是悲观锁? 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作读某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。 ...

weixin_44012722的博客 1121

CLAHE 算法学习 matlab

概念可参考: CLAHE (Contrast Limited Adaptive Histogram Equalization)算法学习CLAHE具体实现主要包括6个步骤。1):分块。将输入图像划分为大小相等的不重叠子块,每个子块含有的像素数为M。参考示例为8×8块。 2):计算子块直方图。 3):计算剪切阈值clipLimit 4):像素点重分配。对每个子块,使用步骤三中多余的像素重新分配。 5):直方图均衡。 6):像素点灰度值重构。(源码中采用了双线性插值) http://www.realtimer

baidu_34971492的博客 4253

数据库锁及死锁的概念

什么是数据库死锁      每个使用关系型数据库的程序都可能遇到数据死锁的情况。理解什么是死锁之前先要了解锁定的概念:如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能更改这个资源了,这种机制的存在是为了保证数据一致性。      多数情况下,可以认为如果

将珍珠串成项链 1822

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据库 之 锁的概念和显示锁的使用

1 概述【为什么要锁】当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制。数据库是一个多用户使用的共享资源,比如一个用户表t_user,两个浏览器前面的人登录了同个一个账号,把电话号码改了。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可...

weixin_34361881的博客 191

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

关于数据库中锁的概念

锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读A用户读取数据,随后B用户读出该数据并修改,...

user2041的博客 3351

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据库锁的概念

锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读A用户读取数据,随后B用户读出该...

叶落啼莺 172

MySQL数据库事务及锁:事务的简介及四大特性、锁的概念、死锁问题

一.事务 1.简介 事务主要用于处理操作量大,复杂度高,并且关联性强的数据。 比如:在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。 在MySQL中只有Innodb存储引擎支持事务。 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。主要针对insert,update,delete语句而设置。 2.事务四大特性 在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具

YFater的博客 800

oracle数据库锁的概念

为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读 “脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks 记 为X 锁)和共享锁(Share locks记为 S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁, 直至T 释放D 上的X 锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为 写...

kingsui 274

锁是网络数据库中的一个非常重要的概念

锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体 实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。          Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系

杨航的专栏 1360

oracle 事务简介,锁的概念,java访问数据库注意事项

java链接oracle和连接其他数据库一样有两种方式:1 桥接 jdbc-obdc2 jbdc insert语句一次插入大量数据 insert into table (列1,列2,列3) select 列1,列2,列3 from table1; update语句在更新数据时直接修改数据(oracle特有的) update table set(列1,列2,列3) = (select ...

111

Oracle数据库锁的概念(转)

原文地址:http://kingsui.iteye.com/blog/293146 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读 “脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks 记 为X 锁)和共享锁(Share locks记为 S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型...

iteye_11827的博客 116

介绍一下锁

加锁是为了确保数据的一致性和完整性,防止多个事务同时对同一数据进行操作而导致的数据冲突造成数据的不一致,同时避免出现脏读、幻读和不可重复读的情况全局锁就是对整个数据库实例加锁,加上全局锁后,整个数据库将处于只读状态,后续的DML语句、 DDL 语句,以及更新操作的事务提交语句都将被阻塞全局锁的典型的使用场景是做全库的数据备份、全库导出等,需要对所有的表进行锁定,从而获取一致 性视图,保证数据的一致性和完整性阻止其他用户读取和更新数据。

QAZ412803的博客 1377

关于数据库的锁的理解

当数据库有并发事务的时候,保证数据访问顺序的机制称为锁机制。乐观锁:是一种乐观的认为并发访问不会产生冲突的锁机制。在使用乐观锁时,系统不会阻塞任何一个线程,而是允许多个线程同时访问共享资源。当一个线程要更新共享资源时,它会先读取当前的版本号或时间戳,并将该值保存在本地。当线程提交更新时,它会将保存的版本号或时间戳与当前的版本号或时间戳进行比较,如果相同,则说明没有其他线程在该线程读取数据之后修改了共享资源,该线程可以成功提交更新。

Sera的博客 908
上一篇: Springboot、SpringCloud等微服务框架的一些看法
下一篇: 常见HTTP错误码定义
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值