您当前的位置:首页 > 电脑百科 > 数据库 > 百科

数据库锁分类

时间:2020-07-03 11:47:20  来源:  作者:

数据库锁

锁和索引是数据库两大核心概念,了解索引,可以从 B+ 树,Hash 索引,页结构,缓存池,索引原则等方面理解。理解锁,要从哪些方面入手?

为什么要加锁

加锁的目的,其实是为了保证数据的一致性。 当多个线程并发访问某个数据时,加锁,可以保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。

锁的分类

锁可以按照锁粒度划分,可以按照数据库管理角度划分。

按照锁粒度划分

按照锁粒度划分,可以将锁划分成 行锁,页锁和表锁。

快速回忆一遍 InnoDB 存储引擎的逻辑结构:所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment)、区(extent)、页(page)组成。

数据库锁分类

 

InnoDB存储引擎的逻辑结构

  1. 行锁

行锁,就是按照行的粒度对数据进行锁定,锁定粒度小,发生锁冲突概率低,可以实现并发都高,但是对于锁的开销比较大,加上会比较慢,容易出现死锁的情况。

  1. 页锁

页锁就是页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录,当我们使用页锁的时候,会出现数据浪费的现象,页锁的开销介于表锁行锁之间。

  1. 表锁

表锁就是对数据进行锁定,锁定粒度很大,发送锁的概率很高,数据访问的并发度。不过好处在于对锁的使用开销小,加锁会很快。

InnoDB 和 Oracle 支持行锁和表锁,MyISAM 只支持表锁, MySQL BDB 存储引擎支持页锁和表锁。SQL Server 可以支持行锁,页锁和表锁。

数据库锁分类

 

image

按照数据库管理角度划分

按照数据库管理角度划分,可以将锁分成排他锁和共享锁。

  1. 共享锁

共享锁,也叫读锁,或者 S 锁,共享锁锁定的资源可以被其他用户读取,但不能修改。 在进行 SElECT 的时候,会将对象进行共享锁锁定,当数据读取完毕之后,就会释放共享锁,这样就可以保证数据在读取时不被修改。

给某个表加共享锁

LOCK TABLE product_comment READ;

当数据表加上共享锁的时候,该表数据就会变成只读模式,当时我们想更新 product_comment 表中的数据会报错,比如:

UPDATE product_comment SET product_id = 10002 WHERE user_id = 912178;

系统报错如下:

ERROR 1099 (HY000): Table 'product_comment' was locked with a READ lock and can't be updated

如果对表共享锁进行解锁:

UNLOCK TABLE;

给某行数据加共享锁

SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

例子:

SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE
  1. 排他锁

排他锁也叫做独占锁,写锁或者 X 锁,排他锁锁定的数据只允许进行锁定操作的事务使用,其他事务无法对已锁定的数据进行查询或者修改。

给表加排他锁

LOCK TABLE product_comment WRITE;

排他锁的事务可以对 product_comment 进行查询和修改。其他事务如果想要在 product_comment 表上查询数据,则需要等待。

释放掉排他锁

UNLOCK TABLE;

数据行上添加排他锁

SELECT * FROM table_name WHERE ... FOR UPDATE

例子:

SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 FOR UPDATE;

当我们对数据进行更新的时候会自动使用排他锁,也就是 INSERT ,DELETE 或者 UPDATE 的时候,数据库自动使用排他锁,防止其他事务对改数据进行操作。

程序员角度进行划分

  1. 乐观锁

乐观锁认为对同一个数据并发操作不会总发生,是小概率事件,因此不用每次对数据进行更新或者删除。

UPDATE ... SET version=version+1 WHERE version=version

此时,如果已经有事务对这条数据进行了更新,修改就不会成功。

数据库锁分类

 

  1. 悲观锁

悲观锁(Pessimistic Locking),通过数据库自身的锁机制来实现,从而保证数据操作的排他性。

  • 乐观锁适合读操作多的场景,相对来说写的操作⽐较少。它的优点在于程序实现,不存在死锁问题,不过适⽤场景也会相对乐观,因为它阻⽌不了除了程序以外的数据库操作。
  • 悲观锁适合写操作多的场景,因为写的操作具有排它性。采⽤悲观锁的⽅式,可以在数据库层⾯阻⽌其他事务对该数据的操作权限,防⽌读-写和写-写的冲突
数据库锁分类

 



Tags:数据库锁   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
数据库锁锁和索引是数据库两大核心概念,了解索引,可以从 B+ 树,Hash 索引,页结构,缓存池,索引原则等方面理解。理解锁,要从哪些方面入手?为什么要加锁加锁的目的,其实是为了保证数据...【详细内容】
2020-07-03  Tags: 数据库锁  点击:(66)  评论:(0)  加入收藏
数据库锁定(Database Lock):为数据管理人员依据数据管理计划(DMP)关闭临床试验数据库,使之无法更改。它是在临床试验结束、EDC系统的所有质疑被解决、经相关批准手续后实施的。也...【详细内容】
2020-04-09  Tags: 数据库锁  点击:(219)  评论:(0)  加入收藏
锁:计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发的一致性...【详细内容】
2019-09-09  Tags: 数据库锁  点击:(155)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(2)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(4)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(7)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(18)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条