首页 > 数据库 >SQL server的事务锁--概念篇

SQL server的事务锁--概念篇

时间:2022-12-26 19:01:11浏览次数:39  
标签:事务 TRANSACTION 隔离 -- 级别 用户 server SQL 数据


在上一篇的SQL事务中我讲到了”事务是恢复和并发控制的基本单位“,但它究竟怎么来控制并发这个过程呢?这就要从事务中的锁这一概念说起。

 

一、概念

在我看来,锁,就是一种手段,在现实生活中的意义就是锁住你不想让别人看到的或者不让别人进去的某个事物,具有一定的私密性。

我们都知道事务是倡导”并发“执行工作的,但如果同时有A和B两个人分别在对方都不知道的情况下,对数据库中的数据进行修改,你改一下,我修一下,那数据库中的数据不就乱套了吗?这时,我们就需要给你想要修改的数据上一把锁,在我修改的这段时间内只能我看,不允许别人看和操作。因此锁也就成为了实现事务的关键。

专业来说:锁使得某些数据或数据结构的其他有效用户在某段时间内无法利用这些数据或数据结构

作用都是为了控制数据库中数据的一致性

本质上来说,锁就是起到一种限制性的作用,它限制了对数据的并发操作

 

二、锁的粒度

锁的粒度是指应用锁的结构的级别或者大小。分为了这几个:

SQL server的事务锁--概念篇_数据库

数据库粒度:锁定整个数据库

表粒度:锁定整个表

页粒度:DBMS趋向于与它们所存储的物理介质一起工作,以帮助他们管理数据。DBMS可以将它的表数据划分为多个快,这些快的大小适合硬盘的一个扇区。这些块被称为页。页的大小通常对应与硬盘的扇区的大小。

行粒度:锁定到行

列粒度:锁定到列,但很少DBMS这样做。因为额外开销非常高,带来的好处也非常少

 

三、锁的级别

锁的级别决定了锁被应用的严格程度,以及是否其他用户可以以任何方式使用数据。

SQL server的事务锁--概念篇_隔离级别_02

1.专有锁:不允许其他用户看到数据,因为数据即将被改变,

2.共享锁:没有人可以修改数据,但是其他用户可以查看或者使用数据,只要不更新它。共享锁也是使用较广泛的,因为你不需要锁定数据使得其他用户无法看到它。

3.死锁:如果不同的用户锁定不同表中的不同记录,则数据库可能会处于这样一种情形:用户1正在等待用户2锁定的数据,而用户2正在等待用户1锁定的数据。在用户能够完成他们的处理并释放他们的锁之前,每个用户需要其他用户锁定的数据。这种情形称为死锁。

我举个例子:就好比上厕所。A正在使用厕所,并且锁起来了,门外的B只能等到A出来之后才能使用。A和B这种等待与使用的环节就是死锁。

4.乐观锁:通常假定事务相互之间没有交互,因此更偏向与使用具有较少限制的锁策略

5.悲观锁:假设事务必定相互干涉,这样需要使用具有较多限制的锁策略

 

四、隔离级别

事务之间的不充许隔离有时候可能会造成严重的问题,将显示不一致的数据,甚至造成数据的不正确。所以数据库的用户和他们事务之间的隔离需要加强。

隔离级别越低,对数据库、其他用户和进程、实现数据库的硬件和平台等的影响越低。

1.SET TRANSACTION语句

在任何事务的开始处改变级别。

SET TRANSACTION ISOLATION LEVEL ISOLATION LEVEL
BEGIN TRANSACTION

一般放在开头,出现了就是告诉DBMS后面的事务要使用哪种隔离级别,只能在开始处改变,当事务开始的过程中不能改变。

 

2.SERIALIZABLE隔离级别

默认级别,也是最大程度的隔离。可以组织更新丢失问题

如果一个事务序列需要在事务执行期间能够读取一个特定的数据集两次,并返回完全相同的数据集,则需要使用。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION

3.READ COMMITTED隔离级别

第三种隔离级别。该级别保证事务不能看到其他事务未确认的更新。使用下面语句声明:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION

 

4.READ UNCOMMITTED隔离级别

最后一种隔离级别。通常如果声明时,会假设READ ONLY。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION

 

五、问题

在上述中我提到了4中隔离级别,我们通过设置不同的隔离级别阻止像:更新丢失、未确认的数据、不一致的数据、幻影插入等问题。

下图未每一种隔离级别以及他们所能够处理的问题。

SQL server的事务锁--概念篇_隔离级别_03

 

事务确保了需要修改数据的用户不看到即将修改的数据或者正在修改过程中的数据。事务索定了数据集,这样可以对记录进行修改,而不会覆盖其他用户的改变,或者允许其他用户覆盖你的改变。

我们都知道锁通常具有非常显著的开销,当上百个或者上前的用户尝试获得锁时,通常会造成数据库的运行速度减慢,出现效率问题。而锁的级别如何通过允许用户看到或者看不到被锁定的记录来降低锁的影响,这是我们需要去深思的。

 

思维导图

SQL server的事务锁--概念篇_数据_04

 

 

 

 

 

标签:事务,TRANSACTION,隔离,--,级别,用户,server,SQL,数据
From: https://blog.51cto.com/u_15921176/5970410

相关文章

  • SQL--WHERE子句相关用法
    【前言】小编今天来总结总结SQL中WHERE子句涉及到的相关知识点 【正文】利用WHERE自居过滤结果MyTableIdNameDateOfBirthAdress3索菲亚1997-09-01USA1贝拉1999-08-07CN......
  • SQL中的事务问题
    在日常生活中你们有没有遇到过这样的问题:我去银行取1000块钱,取款机也把我的余额减去了1000,可是取款机突然坏了,取款的口没吐出来钱,可是你的钱却已经扣了,这时怎么办?当然是找银......
  • SQL视图
    【前言】通常我们在数据库中查询数据时用的是SELECT语句,我们可以用SELECT语句查询任何数据库中的信息,只要数据库有,只要你要。利用SELECT语句,你可以将一个个表通过一些特定的......
  • SQL外部联合:right outer join、left outer join、full outer join
    SQL将外部联合分为了右外部联合(rightouterjoin)、左外部联合(leftouterjoin)、完全外部联合(fullouterjoin)3个类型。 左外部联合:LEFTOUTERJOIN      ......
  • 16、SQL操作JSON字段
    Mysql5.7版本以后提供一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(documentelements)的内部二进制(internalbinary)格式。一、Mysq......
  • express的使用:数据库相关(三)
    1.定义:用来组织,存储和管理数据的仓库2.分类a.MySQL(最广泛,流行度最高,community+enterprise),关系数据库,SQL数据库b.Oracle(收费),关系数据库,SQL数据库c.SQLS......
  • elementui|dropdown|下拉菜单作为模态框使用
    elementui|dropdown|下拉菜单作为模态框使用背景场景:下拉菜单作为模态框使用:操作:下拉菜单设置触发条件点击展示/隐藏:trigger="click"目的:点击取消关闭下拉框遇到的......
  • 实验6
    #include<stdio.h>#include<stdlib.h>intmain(){chara[2][100]={"nuist2022-nuist2023","FIFAWorldCup2022"};FILE*fp;inti,n=0;charch;......
  • 实验八实验报告
                                             实验八介绍:YUM全程(YELLOWDOGUPDATE......
  • AcWing. 1146 新的开始
    传送门题目大意\(\qquad\)给一张图,每个点有对应的点权,每条边有对应的边权。可以有如下几种选择:\(\qquad\quad\)\(1.\)选择一个没通电的点,花费\(v_i\)。\(\qquad\quad\)......