数据库并发操作和封锁技术

2023-10-26

数据库在使用时许多事务可能同时对同一数据进行并发操作此时会破坏数据库的完整性。“并发”指的是在一个CPU上利用分时方法实行多个事务同时做。一般数据库的并发操作会带来三个问题:1.丢失更新 2.读脏数据 3.不可重复读。

个人的解释:1.丢失更新指的是上一个事务的改变在并发过程中没有影响到另一个事务

2.读脏数据指的是上一个事务在未完成的情况下产生的数据影响到了另一个数据

3.不可重复读指的是一个事务有两个读取但是两次读取之间并发了另一个事务导致两次的结果不同

解决办法:这种问题需要以正确的方法进行调度和控制并发事务避免造成数据的不一致

封锁技术的出现可以解决这个问题

首先我们要明白封锁技术的两大分类:X锁S锁

X锁是排他锁又称为写锁 一旦上锁了其他事务都不能在进行操作了只能让该事务操作

S锁是共享锁又称为读锁 一旦上锁其他事务只能进行读的操作而且上了S锁就不可以上X锁

接下来是很重要的一个东西-----封锁协议

封锁协议分为三级首先是所有都要遵守的一条:事务若想要修改数据需要对该数据加X锁

一级协议再满足一条是只读数据的事务可以不加锁即可

二级和三级协议还需要满足其他事务在读数据前需要加S锁,所不同的是二级协议在读完之后即可释放了S锁而三级协议需要在事务执行完后才释放

一级封锁协议可以解决丢失更新的问题

二级封锁协议可以解决读脏数据

三级封锁协议可以解决不可重复读的问题

个人的一些理解:一级封锁协议在修改数据一开始就上了X锁直到结束才释放,这样修改后的结果才可以被另一个事务利用这样就避免了丢失更新的问题。

二级封锁协议在读数据的时候要加S锁,由于事务一旦开始修改数据就上了X锁那么再去读数据的时候S锁是上不去的这样就不会把事务未完全做完之前修改的脏数据读进去了。、

三级封锁协议要求一旦上了S锁需要在事务结束之后才释放,这样两次读数据之间就不会发生被其他并发事务修改数据的现象(因为上了S锁之后不能上X锁)这样读出的两个数据是一样的。

这样我们就解决了并发产生的三种问题了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库并发操作和封锁技术 的相关文章

  • SQL 表别名 - 好还是坏? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 SQL 中使用表别名有哪些优点和缺点 我个人会尽量避免使用它们 因为我认为它们会使代码的可读性降低 特别是在阅读大型 where and 语
  • SQL 外键引用

    Does FOREIGN KEY a REFERENCES A a FOREIGN KEY b REFERENCES A b 与以下含义相同 FOREIGN KEY a b REFERENCES A a b No 有两个references
  • Template_searchpath 在 Airflow 中给出 TemplateNotFound 错误并且找不到 SQL 脚本

    我有一个这样描述的 DAG tmpl search path home airflow gcs sql requests with DAG dag id pipeline default args default args template
  • 仅当列不为 NULL 时才连接列

    我有一个像这样的 SQL Server 表 PERSON NAME PHONE PHONE1 PHONE2 PHONE CONCAT Name1 12345 Null Null Null
  • MySQL - 将字段的默认值设置为字符串连接函数

    我有一个看起来有点像这个的表 actor forename surname stage name 我想将 stage name 更新为默认值 forename surname So that insert into actors foren
  • 高级 MySQL:查找民意调查响应之间的相关性

    我有四个 MySQL 表 users 身份证号 姓名 polls ID 文本 options id poll id 文本 回应 id poll id 选项 id 用户 id 给定一个特定的民意调查和一个特定的选项 我想生成一个表格 显示其他
  • Oracle数据库中的自增主键

    我想在 SQL Server 的列中实现标识或自动递增值 CREATE TABLE RollingStock Id NUMBER IDENTITY 1 1 Name Varchar2 80 NOT NULL 如何才能做到这一点 正如 Orb
  • sql查询中where子句中的CASE语句

    我正在尝试在我正在处理的查询的 where 子句中编写一个 case 语句 我正在水晶报告中导入代码 我基本上是想说明变量 类型 是否设置为 创建 以便在where子句中为该日期范围运行 否则为不同的日期范围运行 它一直给我一个错误 我似乎
  • 获取每件商品的最新价格

    我有一张桌子 ItemID PurchaseDate Price 001 03 17 2013 19 00 002 03 17 2013 14 00 001 03 18 2013 13 00 002 03 18 2013 15 00 001
  • ssis将N个表从源服务器加载到目标服务器的最佳实践

    我需要将 N 个 大约 50 个 表从源数据库加载到目标数据库 每个表都与其他表不同 因此元数据不同 我想我可以使用父 pkg 来调用子 pkg 其中每个子 pkg 都有简单的结构 例如 DFT 来映射要导入的表 1 个子 pkg gt 1
  • 在数据库中有效存储商品位置(用于订购)

    设想 有一个用户拥有的电影数据库 电影显示在一个名为 我的电影 的页面上 电影可以按照用户想要的顺序显示 例如 位置 1 为 搏击俱乐部 位置 3 为 Drive 依此类推 显而易见的解决方案是存储每个项目的位置 例如 电影 ID 用户 I
  • 如何从 tarantool 中选择有限数量的记录,就像 SQL 中的 SELECT LIMIT 一样?

    我想在 Tarantool 空间上执行选择 使用过滤和限制结果 就像我可以使用简单的 SQL 查询一样 SELECT FROM users WHERE age gt 33 LIMIT 1 我怎样才能做到这一点 可以使用 Lua 和 SQL
  • 在 SQL 中查询行序列

    假设我正在存储events有关联users如下表 其中dt代表事件的时间戳 dt user event 1 1 A 2 1 D 3 1 B 4 1 C 5 1 B 6 2 B 7 2 B 8 2 A 9 2 A 10 2 C 这样我们就可以
  • 有向图 SQL

    我有以下数据集 它表示有向图中的节点 CREATE TABLE nodes NODE FROM VARCHAR2 10 NODE TO VARCHAR2 10 INSERT INTO nodes VALUES GT TG INSERT IN
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • 找出会话的默认 SQL Server 架构

    我需要知道正在执行某些 DDL 的 SQL 脚本中当前的默认架构是什么 我不需要设置架构 但我确实需要将对它的引用 名称或 ID 放入变量中 该脚本可能以 Windows 登录身份运行 因此以下内容还不够 SELECT name defau
  • 左连接,左表中没有重复行

    请看下面的查询 tbl 目录 Content Id Content Title Content Text 10002 New case Study New case Study 10003 New case Study New case S
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 更新查询时 ios 中出现“数据库锁定”错误

    我正在使用下面的代码更新查询 using sqlite 但我越来越 database is locked error 我尝试搜索一些 SO 链接 建议关闭数据库 但我再次执行此操作时遇到相同的错误 我已经提到过代码中出现错误的地方 cons
  • SQL Server XQuery 返回错误

    我正在 SQL Server 2012 中对 XML 数据类型列执行查询 数据示例如下

随机推荐

  • Java 终止嵌套for 循环总结

    public class NestedLoopDemo public static void main String args 第一步 构建嵌套for 循环 for int i 0 i lt 10 i for int j 0 j lt 10
  • 手把手教你用Python进行回归(附代码、学习资料)

    作者 GURCHETAN SINGH 翻译 张逸 校对 丁楠雅 本文共5800字 建议阅读8分钟 本文从线性回归 多项式回归出发 带你用Python实现样条回归 我刚开始学习数据科学时 第一个接触到的算法就是线性回归 在把这个方法算法应用在
  • Golang函数

    一 函数 1 为完成某一功能的程序指令的集合 称为函数 在Go中 函数分为 自定义函数和系统函数 2 基本语法 func 函数名 形参列表 返回值类型列表 执行语句 return 返回值列表 1 形参列表 表示函数的输入 2 函数中的语句
  • 搭建electron开发环境

    electron是使用js html css构建桌面端应用程序的框架 可以使用electron开发Windows和Mac端应用 安装nodejs npm cnpm 首先需要安装nodejs npm和cnpm 安装后在命令行输入 node v
  • 2023华为OD机试真题【最多等和不相交连续子序列】

    题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输入描述 第一行输入为数组长
  • CUDA C编程向量加法-第3章 CUDA 简介

    第3章 CUDA 简介 大规模并行处理器编程实战 学习 其他章节关注专栏 CUDA C CUDA C 编程友情链接 第三章 CUDA 简介 CUDA C编程向量加法 第四章 CUDA数据并行执行模型 第五章 CUDA 存储器 第六章 CUD
  • 网站开发流程(开发环境/测试环境---生产环境)

    最近接手了两个独立站点的开发 开发完成交付的时候 中间遇到了很多问题 也让我有了很多思考 1 由于是利用wordpress建站 所以是先把站点程序部署在了服务器上 那么我的当前环境既是开发环境 又是生产环境 风险很大 2 公司开发 基本都会
  • 有源带阻和无源带阻的区别_浅析无源滤波和有源滤波组成的滤波电路以及运放反馈...

    小编前几篇和大家一起初步的浅析了无源滤波和有源滤波组成的滤波电路以及运放反馈的分类 先和大家一起回顾一下 有源滤波分为 低通滤波 积分电路 高通滤波 微分电路 带通滤波 后期再和大家分享 带阻滤波 后期再和大家分享 运放电路反馈分为 电流反
  • python算法:求a+aa+aaa.....的和

    题目 给定两个均不超过9的正整数a和n 要求编写函数fn a n 求a aa aaa aa aa n个a 之和 fn须返回的是数列和 其中 a 和 n 都是用户传入的参数 a 的值在 1 9 范围 n 是 1 9 区间内的个位数 函数须返回
  • 划片机实现装片、对准、切割、清洗到卸片的自动化操作

    划片机是一种用于切割和分离材料的设备 通常用于光学和医疗 IC QFN DFN 半导体集成电路 GPP LED氮化镓等芯片分立器件 LED封装 光通讯器件 声表器件 MEMS等行业 划片机可以实现从装片 对准 切割 清洗到卸片的自动化操作
  • 面向对象设计原则——迪米特法则

    一 背景 软件编程的总的原则 低耦合 高内聚 无论是面向过程编程还是面向对象编程 只有使各个模块之间的耦合尽量的低 才能提高代码的复用率 低耦合的优点不言而喻 但是怎么样编程才能做到低耦合呢 那正是迪米特法则要去完成的 二 迪米特法则 迪米
  • 语音识别开源框架

    语音识别开源框架 文章目录 语音识别开源框架 Whisper 特征 Github地址 开源文档介绍 论文参考 ASRT 特征 环境 Github地址 开源文档介绍 DeepSpeech 特征 环境 Github地址 文档介绍 论文参考 De
  • 使用Flask渲染静态网页(模板)

    假设我们有了一个已经写好的网页 我们希望把这个网页展示出来 我们需要怎么做呢 在Flask中我们把这一工作叫做渲染模板 其中我们准备好的网页叫做模板 渲染工作交给一个叫做jinja2的模板引擎就好了 具体使用方法是调用函数render te
  • API服务网关实现之APISIX安装和部署

    一 APISIX相关介绍 1 安全网关 安全网关设置的目的是防止Internet或外网不安全因素蔓延到自己企业或组织的内部网 安全网关在应用层和网络层上面都有防火墙的身影 其范围从协议级过滤到十分复杂的应用级过滤等 推荐了解传智播客linu
  • 九、SQL-labs的第24关——二次注入(Post)

    二次注入首先的一点就要在HTTP请求中提交恶意代码 将这个恶意代码存储在数据库中 以便后面使用 在第24关 我们是通过注册新账号这种方式 将恶意代码存储到数据库中 假设我们的攻击目标是Dummy 1 将恶意代码存储到数据库中 点击注册 输入
  • Hive-Hive排序

    1 DQL 排序问题 1 1 order by 默认是升序asc 可指定降序desc order by是全局排序 只能有一个reduce作业来完成 多个reduce 如何保证全局顺序 hive mapred mode改为strict 则使用
  • 常用的工具

    进程 1 IDA 交互式反汇编器专业版 Interactive Disassembler Professional 简称为IDA IDA Pro是一款支持交互 可编程的 扩展插件 支持多种处理器的逆向工程利器 我一般用来看看库依赖 2 Pr
  • CMake学习之include

    文章目录 一 cmake incldue 二 示例 一 cmake incldue 从给定的文件中读取CMake的列表文件 include file OPTIONAL RESULT VARIABLE VAR 从给定的文件中读取CMake的清
  • 腾讯公司面试题【1】

    腾讯面试题 给你10分钟时间 根据上排给出十个数 在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数 上排的十个数如下 0 1 2 3 4 5 6 7 8 9 举一个例子 数值 0 1 2 3 4 5 6 7 8
  • 数据库并发操作和封锁技术

    数据库在使用时许多事务可能同时对同一数据进行并发操作此时会破坏数据库的完整性 并发 指的是在一个CPU上利用分时方法实行多个事务同时做 一般数据库的并发操作会带来三个问题 1 丢失更新 2 读脏数据 3 不可重复读 个人的解释 1 丢失更新