数据库并发事务

        数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些并发事务的问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。

事务特性:ACID

  • 原子性(Atomicity):
  • 一致性(Consistent):
  • 隔离性(Isolation):
  • 持久性(Durable):

事务并发可能带来的问题

  • 丢失更新或者脏写:两个事务同时更新一个数据,后提交的事务会把先提交的结果
  • 脏读:A事务读到了B事务未提交的数据。 如果B事务回滚,A则读到了一个无效数据。
  • 不可重复读:在一个事务中连续对同一数据读多次,读到的结果不一致。(其他事务做了修改)
  • 幻读:在一个事务中,相同的条件多次统计记录条数,个数不一致。(其他事务新增了满足其条件的数据)

事务隔离级别

-- 看当前数据库的事务隔离级别
show variables like 'tx_isolation';
-- 设置事务隔离级别
set tx_isolation='REPEATABLE-READ';

        Mysql默认的事务隔离级别是可重复读,用Spring开发程序时,如果不设置隔离级别默认用Mysql设置的隔离级别,如果Spring设置了就用已经设置的隔离级别。

  • 读未提交:
  • 读已提交(RC):
  • 可重复读(RR):使用了MVCC机制, select是读的事务开始时的快照版,update则是当前读,读的是数据库中最新的值。
  • 串行化:

在一个事务中, 读到的内容都是事务开始时的一个快照, 即读取的内容不变; 但如果当前事务对一个记录做修改(排他锁,其他事务无法对这个记录做修改), 修改的记录再重新读取,读到的是最新的。

问题:隔离级别底层是怎么实现的呢?

  1. 乐观锁不要用在可重复读级别, 要在更小的两个隔离级别用
  2. 通过快照读取,但并不是每个事务都创建一个对应的快照
  3. RC对并发要求高;RR对同一时间维度要求高

间隙锁:锁的是两个值之间的空隙。

临键锁(Next-key Locks):行锁和间隙锁的组合,包含范围的边界。

乐观锁:java中用版本号实现。update tableA set amount = 200 where id = 1 and version=1;

悲观锁:java在sql中直接执行。update tableA set amount = amount + 500 where id=1

页锁:只有BDB存储引擎支持叶锁,锁的资源比行锁多,比表锁少。考虑索引树种的一个节点,就是对应一页,相对于对这一页加锁。

读/写锁/意向锁

  • -- 手动增加表锁
    lock table 表名称 read(write), 表名称2 read(write);
    -- 查看表上加过的锁
    show open tables;
    -- 删除表锁
    unlock tables;
    -- 共享锁/读锁
    select * from T where id=1 lock in share mode
    -- 排他锁/写锁
    select * from T where id=1 for update
  1. 读锁:其他事务可读,不可写(阻塞); 当前事务可读,不可写
  2. 写锁:其他事务不可读,不可写(阻塞);当前事务可读,可写
  3. 意向锁(Intention Lock):当有事务给表的数据行加了共享锁或排他锁,同时会给表设置一个标识,代表已经有行锁了,其他事务要想对表加表锁时,就不必逐行判断有没有行锁可能跟表锁冲突了,直接读这个标识就可以确定自己该不该加表锁。这个标识就是意向锁。相当于对表加锁。 分为意向共享锁(IS)意向排他锁(IX)

行/表锁

行锁添加方式

1. 更新操作where条件使用索引列

        >update account set balance = 800 where name ='lilei';

2. lock in share mode(共享锁) 

        >select * from T where id = 1 lock in share mode;

3. 排他锁for update

        >select * from test_innodb_lock where a=2 for update

无索引行锁会升级为表锁

        锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁。

        session1 执行:update account set balance = 800 where name ='lilei';

        session2 对该表任一行操作都会阻塞住

        InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为表锁。注意:并不是直接将整张表加上表锁,因为有的记录可能被其他事务锁住。 (那这种情况是否能加锁成功呢?

        RR级别会升级为表锁,RC级别不会升级为表锁。(为什么?

行锁竞争分析

show status like 'innodb_row_lock%'

对各个状态量的说明如下:

Innodb_row_lock_current_waits: 当前正在等待锁定的数量

Innodb_row_lock_time: 从系统启动到现在锁定总时间长度

Innodb_row_lock_time_avg: 每次等待所花平均时间

Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间

Innodb_row_lock_waits:系统启动后到现在总共等待的次数

对于这几个状态变量,比较重要的主要是:

Innodb_row_lock_time_avg (等待平均时长)

Innodb_row_lock_waits (等待总次数)

Innodb_row_lock_time(等待总时长)

尤其是当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化计划。

InnoDB与MYISAM的最大不同

  1. InnoDB支持事务(TRANSACTION)
  2. InnoDB支持行级锁

问题:为啥MyISAM不支持行级锁?

  1. MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。
  2. InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁

锁相关几个问题:

1、Mysql默认的隔离级别是可重复读,有办法可以解决幻读吗?

答:间隙锁在某些情况下可以解决幻读

那么间隙就有 id 为 (3,10),(10,20),(20,正无穷) 这三个区间,

在Session_1下面执行 update account set name ='zhuge' where id > 8 and id <18;,则其他Session没法在这个范围所包含的所有行记录(包括间隙行记录)以及行记录所在的间隙插入或修改任何数据,即id在(3,20]区间都无法修改数据,注意最后那个20也是包含在内的。(3,20]整个区间可以叫做临键锁

间隙锁是在可重复读隔离级别下才会生效。间隙锁是为了解决幻读问题,所以作用在可重复读级别。实际测试下来确实可可重复读级别间隙锁才生效。

2、多个查询操作,是否要放在事务中?

答:这个问题主要是考察事务并发问题, 以及解决这些问题需要的隔离级别。

如果要保证读取数据的一致性,那必须放在事务中, 且这个事务是可重复读的隔离级别。

3、事务中,有读和写操作, 哪个放前?

答:更新等涉及到加锁的操作尽可能放在事务靠后的位置。目的是减少锁住的时间。

锁优化

  1. 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  2. 合理设计索引,尽量缩小锁的范围
  3. 尽可能减少检索条件范围,避免间隙锁
  4. 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
  5. 尽可能用低的事务隔离级别

MVCC多版本并发控制

Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。

undo日志版本链

一行数据多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链。

readview和可见性算法

        readview和可见性算法其实就是记录了sql查询那个时刻数据库里提交和未提交所有事务的状态。

        RR隔离级别,事务里每次执行查询操作readview都是使用第一次查询时生成的readview。保障事务内对同一个数据的查询查的结果都一致。

        RC隔离级别,事务里每次执行查询操作readview都会按照数据库当前状态重新生成readview.保障读取到其他事务提交的最新的结果。

事务开始时间

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作或加排它锁操作(比如select...for update)的语句,事务才真正启动,才会向mysql申请真正的事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89310.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89310.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89310.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bilibili多语言字幕翻译扩展:基于上下文的实时翻译方案设计

Bilibili多语言字幕翻译扩展&#xff1a;基于上下文的实时翻译方案设计 本文介绍了一个Chrome扩展的设计与实现&#xff0c;该扩展可以为Bilibili视频提供实时多语言字幕翻译功能。重点讨论了字幕翻译中的上下文问题及其解决方案。 该项目已经登陆Chrome Extension Store: http…

热血三国野地名将列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名将信息表</title><style>tabl…

【记录】Word|Word创建自动编号的多级列表标题样式

文章目录 前言创建方式第一种方法&#xff1a;从“定义多级列表”中直接绑定已有样式第二种方法&#xff1a;通过已有段落创建样式&#xff0c;再绑定补充说明 尾声 前言 这世上荒唐的事情不少&#xff0c;但若说到吊诡&#xff0c;Word中的多级列表样式设定&#xff0c;倒是能…

使用mavros启动多机SITL仿真

使用mavros启动多机SITL仿真 方式1&#xff1a;使用roslaunch一键启动Step1&#xff1a;创建一个新的 ROS 包或放到现有包里Step2&#xff1a;编辑 multi_mavros.launchStep3&#xff1a;构建工作空间并 source 环境Step4&#xff1a;构建工作空间并 source 环境 方式2&#xf…

Flutter 网络栈入门,Dio 与 Retrofit 全面指南

面向多年 iOS 开发者的零阻力上手 写在前面 你在 iOS 项目中也许习惯了 URLSession、Alamofire 或 Moya。 换到 Flutter 后&#xff0c;等价的「组合拳」就是 Dio Retrofit。 本文将带你一次吃透两套库的安装、核心 API、进阶技巧与最佳实践。 1. Dio&#xff1a;Flutter 里的…

工作室考核源码(带后端)

题目内容可更改 下载地址:https://mcwlkj.lanzoub.com/iUF3z300tgfe 如图所示

数字孪生技术为UI前端提供全面支持:实现产品的可视化配置与定制

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;数字孪生驱动产品定制的技术革命 在消费升级与工业 4.0 的双重驱动下&a…

通往物理世界自主智能的二元实在论与罗塞塔协议

序章&#xff1a;AI的“两种文化”之争——我们是否在构建错误的“神”&#xff1f; 自诞生以来&#xff0c;人工智能领域始终存在着一场隐秘的“两种文化”之争。一方是符号主义与逻辑的信徒&#xff0c;他们追求可解释、严谨的推理&#xff0c;相信智能的核心在于对世界规则…

探索 AI 系统提示与模型资源库:`system-prompts-and-models-of-ai-tools`

在当今的人工智能领域,系统提示和工具模型的优化与应用对于提升 AI 助手的性能和响应质量至关重要。x1xhlol 开源的 system-prompts-and-models-of-ai-tools 仓库为开发者们提供了一个丰富的资源集合,涵盖了多种 AI 工具的系统提示、工具和模型。 仓库概述 这个仓库包含了超…

城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 “城市灯光夜景人像街拍摄影后期 Lr 调色”&#xff0c;主要是利用 Lightroom 软件&#xff0c;对城市夜景中灯光下的人像街拍照片进行处理。通过调整色彩平衡、明暗对比和细节质感&#xff0c;强化夜景灯光的绚丽感&#xff0c;突出人像主体&#xff0c;同时协调人物…

JavaScript中的call、apply、bind:用法、实现与区别详解(面试常见)

# JavaScript中的call、apply、bind&#xff1a;用法、实现与区别详解## 核心概念 这三个方法都用于改变函数执行时的this指向&#xff0c;是JavaScript中函数上下文操作的核心API。## 1. 基本用法对比### call方法 javascript function.call(thisArg, arg1, arg2, ...)特点&am…

使用vue开发浏览器chrome插件教程,及之间的消息通信

基本介绍 开发浏览器插件&#xff0c;首先需要先了解他的结构&#xff0c;浏览器扩展通常包括以下几个部分 ├── manifest.json ├── package.json ├── vite.config.js ├── src ├── background │ └── index.js ├── content │ └── content.js ├── …

论文笔记(八十八)MLCVNet: Multi-Level Context VoteNet for 3D Object Detection

MLCVNet: Multi-Level Context VoteNet for 3D Object Detection 文章概括摘要I. 引言2. 相关工作2.1. 基于点云的 3D 目标检测2.2. 上下文信息 3. 方法3.1. VoteNet3.2. PPC 模块3.3. OOC 模块3.4. GSC 模块 4. 结果与讨论4.1. 数据集4.2. 训练细节4.3. 与最先进方法的比较4.4…

Redis初识第四期----Hash的命令和应用场景

首先为了区分Redis的键值对存储的key-value&#xff0c;Hash中的键值对称为field-value。 命令 1.Hset Hset key field value [field value] 返回值为设置成功的field-value的个数。 2.Hget Hget key field 返回为value 3.Hexists Hexists key field 判断是否存在&a…

【大数据技术栈】数据管理范畴常用大数据技术栈

一、技术栈分层架构 大数据技术栈通常分为四个核心层级&#xff1a; 数据采集层 负责多源异构数据的实时/批量采集 日志采集&#xff1a; F l u m e Flume Flume、 L o g s t a s h Logstash Logstash消息队列&#xff1a; K a f k a Kafka Kafka、 R a b b i t M Q RabbitMQ …

安全左移(Shift Left Security):软件安全的演进之路

文章目录 一、背景&#xff1a;传统安全的尴尬处境二、安全左移&#xff1a;让安全成为开发的“第一等公民”三、安全左移的关键实施阶段1. 需求阶段&#xff1a;嵌入安全需求建模2. 设计阶段&#xff1a;威胁建模与架构审计3. 编码阶段&#xff1a;安全编码规范与静态分析4. 构…

固定债可以卖call吗

我们都知道如果持有tlt&#xff0c;可以卖call来赚取时间价值&#xff0c;如果我买固定到期的美债而不是etf&#xff0c;有类似的操作吗&#xff0c;我可以卖call吗 以下是关于直接持有固定到期美债并尝试卖出看涨期权的详细分析&#xff1a; 一、直接持有美债与ETF&#xff08…

fish安装node.js环境

为什么强调fish shell&#xff0c;因为fish shell的缘故&#xff0c;不能直接执行node.js官网的命令 好的&#xff0c;您遇到了一个非常典型且重要的问题。请仔细阅读我的分析&#xff0c;这能帮您彻底解决问题。 问题诊断 您看到的所有错误&#xff0c;归根结底有两个核心原…

记一次Ubuntu22安装MongoDB8并同步本地数据过程

1. 效果展示 2. 安装MongoDB 8 根据官方文档https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-ubuntu/一顿操作即可 2.1 配置微调支持远程访问 修改配置文件,默认/etc/mongod.conf # network interfaces net:port: 27017bindIp: 0.0.0.02.2 新增adm…

HarmonyOS应用开发高级认证知识点梳理 (三)状态管理V2装饰器核心规则

以下是针对HarmonyOS应用开发高级认证备考的‌状态管理V2装饰器核心规则‌知识点系统梳理&#xff1a; 一、核心装饰器分类与功能 1. ‌组件声明装饰器‌ ComponentV2‌ (1)基础定义与限制 功能定位‌ 用于装饰自定义组件&#xff0c;启用V2状态管理能力&#xff0c;需配…