MySQL读写锁总结

2023-11-09

读写锁

  • 读锁:是一种共享锁,一个事务持有读锁时,不会阻塞其它的读锁,其他事务都可以对该数据进行读取;
  • 写锁:是一种排他锁,一个锁持有写锁会阻塞其他的写锁和读锁,从而保证了一个只有一个事务进行写操作,并且防止其他事务读取正在写入资源,避免了脏读;

锁策略

锁策略:就是在锁的开销和数据安全性之间寻求平衡;

  • 表锁:表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表,一个事务在对表进行写操作(插入、删除、更新等)前,需要获取写锁,这样会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的事务才能获得读锁,读锁之间是不阻塞的。另外,写锁比读锁有更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面,而反之则不可。
  • 行级锁:可以最大程度上的支持并发操作,同时也带来最大的锁开销。

范式

  1. 第一范式:数据库的每一列都是不可分割的原子数据,即不可拆分;
  2. 第二范式:建立在第一范式基础上,要求每一行的数据被唯一的区分出来,就是具有唯一标示;
  3. 第三范式:在第二范式的基础上,要求任何非主属性只依赖于主属性,而与其他属性之间不存在依赖关系。

多版本并发控制(MVCC)

  1. 特点:MVCC是行级锁的一种变种,但是它很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的锁。
  2. 实现方式:通过在每行记录后面保存两个隐藏的列来实现。这两列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。存储的不是实际时间,而是系统版本号。
  3. 优点:通过保存两个额外的系统版本号,使得大部分读操作不需要加锁,性能很好,并且能够保证只读到符合标准的数据。
  4. 缺点:每个记录都需要额外的存储空间,需要更多的检查工作,以及一些额外的维护工作。
  5. MVCC只在可重复读和读以提交两个隔离级别工作。

存储引擎

(待补充)

事务的隔离级别

(待补充)

索引

(待补充)

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

MySQL读写锁总结 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • linux 终端使用aplay播放wav

    aplay D plughw 0 0 xxx wav plughw后面的0 0指的是card0 device0 声卡id和设备id 根据个人情况会有不同 声卡id和设备id可以通过aplay l命令来查看 比如 upsquared ubun
  • Redis5.0集群搭建(Redis Cluster)

    Redis集群 redis集群是一个由多个主从节点群组成的分布式服务器群 它具有复制 高可用和分片特性 Redis集群不需要sentinel也能完成节点移除和故障转移的功能 需要将每个节点设置成集群模式 这种集群模式没有中心节点 可水平扩展
  • [1116]mobaxterm使用rz/sz

    安装 yum y install lrzsz 下载 步骤1 sz filename 步骤2 ctrl 鼠标右键 步骤3 Receive file using Z modem 上传 步骤1 rz 步骤2 ctrl 鼠标右键 步骤3 Send
  • ArchLinux安装fcitx5以及拼音输入法

    简介 输入法引擎 需要注意的是 fcitx5 只是提供了基本框架 基本框架只对英文提供了输入支持 如果需要输入其他语言 则需要安装相应的输入法引擎 中文 fcitx5 chinese addons 包含了大量中文输入方式 拼音 双拼 五笔拼
  • SMTP邮件格式、SMTP 协议,SMTP的MIME写法,SMTP发送HTML邮件

    转载 http blog sina com cn s blog 759444350100vx8u html MIME邮件格式 在RFC 2822文档中定义了简单的ASCII编码的Email的邮件格式 然而随着Internet的发展 Emai
  • JSP JSTL 判断List 大小

    JSTL判断List 大小必须先引入的二个核心包 jsp页面判断获得action设置attribute的List是否为空或者list size的长度 就可以用fn这个标签
  • python写的一个-批量下载股票年报的小工具

    python写的一个 批量下载股票年报的小工具 from urllib import request import requests import os import openpyxl print os getcwd def getKeyL
  • Java中怎么定义字符串?

    字符串是 Java 中特殊的类 使用方法像一般的基本数据类型 被广泛应用在 Java 编程中 Java 没有内置的字符串类型 而是在标准 Java 类库中提供了一个 String 类来创建和操作字符串 在 Java 中定义一个字符串最简单的
  • oracle 学习之:for循环中包涵select语句

    oracle中的for循环用法比较简单 但是在一次用到包涵select语句的for循环时 还是发现了一些自己以前没有注意的东西 我的代码如下 declare val1 date val2 date begin for i in select
  • pc端微信二维码支付流程及问题排查

    场景 在做pc端的支付时 我们常用的就是生成二维码让用户去扫码支付 like this 当然你想像我一样有个二维码支付的图片 还需要先申请微信支付的native支付功能 native支付会提供一个二维码供用户扫码 页面内 通常会有一个按钮
  • Rust学习记录 -> 关于Crates.io的问题

    文章目录 前言 问题描述与解析 1 版本更迭带来的依赖包适配问题 2 openssl 总结 前言 最近我在使用rust语言编写一个商场后端demo时 由于需要与mysql进行交互以及序列化等操作 所以通过crates io下载了许多外部依赖
  • SLAM评估工具evo的使用

    evo官方指南 参考博客 lt 官方手册 这篇参考博客 完全可以掌握evo的基本操作 gt Then 实践出真知 1 安装evo sudo apt install python pip pip install evo upgrade no
  • 阿里云图标使用 (symbol 引用方式)

    阿里云图标网址 https www iconfont cn 一 登录注册 这个简单 就不说了 二 给当前项目找图库 2 1 添加项目 2 2 寻找图标添加入库 添加入库 2 3 打开入库 的图标添加到指定项目 添加到当前项目 1 2 三 项
  • 在线考试平台搭建

    出于工作需要 在万能的Github上找到的考试平台 在此感谢平台的创作者 github https github com YXJ2018 SpringBoot Vue OnlineExam 在线考试系统 下载该项目后 因为各种各样的原因 导
  • 【Vue3】Fragment组件、Teleport组件和Suspense组件

    Fragment组件 在Vue2中 组件必须有一个根标签 在Vue3中 组件可以没有根标签 内部会将多个标签包含在一个Fragment虚拟元素中 好处 减少标签层次 减少内侧占用 Teleport组件 是一种能够将我们的组件html结构移动
  • 【GIT 坑&常见问题】

    文章目录 前言 git github 使用问题 坑 连接不上github 1 过后再连 2 使用某些途径 3 修改git 的http 和https的代理 4 使用VS 在创建远程仓库的时候 别在远程仓库进行修改 git LFS上传超过100
  • C++ try{} catch(…){} 与 Throw()的编译器优化

    try catch 用 try catch 来捕获C 中一些意想不到的异常 这种方法在VC中其实是靠不住的 例如下面的代码 try BYTE pch pch BYTE 00001234 给予一个非法地址 pch 6 对非法地址赋值 会造成A
  • Linux中主线程和子线程的终止次序

    Linux中pthread是我们进行多线程并发时经常使用的 pthread创建的子线程和主线程的终止顺序有什么样的关系 下面通过代码来总结下 在代码测试前 先说下结论 1 主线程和子线程之间没有必然的退出次序关系 主线程退出 子线程可以继续
  • 每日一练python:求输入两个数之间的所有质数

    前言 立个flag 每天更新一则今日学到的知识 为成为一个合格的AI训练师而努力 今天将用两种编程思路来求两个数之间的所有质数 方案一 coding utf 8 输入数据 st input input first number gt nd
  • MySQL读写锁总结

    读写锁 读锁 是一种共享锁 一个事务持有读锁时 不会阻塞其它的读锁 其他事务都可以对该数据进行读取 写锁 是一种排他锁 一个锁持有写锁会阻塞其他的写锁和读锁 从而保证了一个只有一个事务进行写操作 并且防止其他事务读取正在写入资源 避免了脏读