Mysql数据库(2)—事务和锁

news2024/10/7 4:27:22

一、事务

数据库事务的特性?

数据库事务的四大特性是ACID。

  1. 原子性:就是所有操作要么全不做,要不全做。通过undo日志来实现。
  2. 一致性:就是在并发情况下数据库由一个状态转移到另一个状态的数据要一致。通过事务的隔离级别来实现。
  3. 隔离性:多个事务的操作互相不影响,数据有4种隔离级别来解决。基于锁+mvcc机制来实现。
  4. 持久性:数据库中事务一旦提交,数据持久到硬盘中。基于redo日志来实现。

数据不一致的问题

  1. 脏读:事务A读取一个数据,事务B对该数据进行修改,修改前后的数据都可以读到,但是数据会不一样,导致了脏读。脏读强调的是读到其他事务未提交的数据。
  2. 不可重复读:事务A读一个数据,事务B对该数据进行修改后提交,导致事务A前后读取的数据值不一致。不可重复度强调的是读到其他事务提交后的数据和提交前的数据不一致。
  3. 幻读:事务A读取一个数据,事务B在insert、delete增删记录,事务A两次读取的数据条数不一致

事务的隔离级别

事务的隔离级别描述的是在多个事务同时运行过程中各自事务中数据的隔离办法,事务的隔离级别是为了解决数据库中以上常见的三类问题,包括:脏读、不可重复读和幻读的问题,者四类隔离级别分别为:

  • 未提交读:事务A可以读到事务B未提交的数据;
  • 已提交读:事务A只能读到事务B提交后的数据;
  • 可重复读:事务A能读取到事务B还未执行完的数据,但是读取到的是事务B未开始事务前的数据,只有当事务B执行完成了才会读取到新的数据;
  • 可串形化:事务A、事务B的读写操作是串形化的;

总结:

  • 以上4类隔离级别的约束条件从宽松到严格;
  • 未提交读隔离级别没有解决任何问题;
  • 已提交读解决了脏读的问题;
  • 可重复读解决了不可重复读的问题,但还存在幻读的问题,但结合MVCC和record lock能解决幻读的问题;
  • 只有可串形化隔离级别能解决所有数据不一致的问题;
  • Mysql的默认隔离级别是可重复读。

mysql如何解决幻读?

在快照读情况下,即不加锁的非阻塞读,像普通select操作下通过mvcc避免幻读;通过乐观锁类避免。

对于可重复读的隔离级别下,select * from table的语句是采用快照读的模式,新的事务会读快照;

在当前读情况下,当前读表示需要读取当前最新数据,是加锁的阻塞读写操作,像普通update/insert/delete和加update的select操作,是通过next-key lock避免幻读;通过悲观锁来避免。

对于可重复读的隔离级别,如果是当前读场景,需要通过间隙锁(Gap Lock)模式来避免幻读,这样行间间距会被加锁,不会被新的事务插入新的数据,间隙锁加行锁合起来称为next-key lock;

二、锁

锁是计算机中协调多线程并发访问共享资源的机制,在数据库中就是协调多个事务同时访问同一数据记录的机制,在Mysql数据库中进行加锁的对象是索引中的索引项,会在索引项上做加锁标记。

锁的分类

mysql数据库的锁分为行锁和表锁。

A11F43AF-0F68-4D8F-83AB-2022CCC4884F

  • 行锁。是innodb存储引擎的默认加锁方式,特点是开销大,加锁慢,锁力度小,所以并发度高,适合写多读少场景。

  • 表锁。是myisam存储引擎的默认加锁方式,特点是开销小,加锁快,锁粒度大,所以并发度低,适合读多写少场景。

  • 记录锁(Record lock):即是行级锁,是innodb存储引擎的默认加锁方式。

  • 间隙锁(Gap lock):会对记录之间的左开右闭的区间进行加锁;

  • 临键锁(Next key Lock):记录锁+间隙锁统称为临键锁。

  • 共享锁(读锁)&独占锁(写锁):共享锁又称S锁/读锁,对记录进行读操作时进行加的锁,可以共享;独占锁又称X锁/写锁,对记录进行写操作时进行加锁,只能独占;

  • 意向共享锁&意向排它锁:为了解决对记录加了共享锁&独占锁,再对表加表锁的时候需要遍历,所以在对行加共享锁&独占锁时候,会对表加上意向共享锁&意向排它锁,下次加表锁一目了然,这是一类表锁。

  • 插入意向锁:就是多个事务在进行插入的时候,已经有事务在进行插入操作了,另一个在等待的事务需要加上插入意向锁,用以表面针对目前的间隙位置有插入的需求;

数据库里的乐观锁和悲观锁?

所有需要加锁的操作都是在进行多线程情况下才需要的。

  1. 乐观锁比较好理解,就是预测所有线程对数据的操作都是不会冲突的,所以每次对数据进行操作时候都不会加上锁;mysql内部机制可以通过mvcc机制来是实现乐观锁;
  2. 悲观锁则相反,就是认为每次线程对数据的操作都可能存在冲突,所以需要对数据加上行锁、表锁等。mysql主要通过record lock+nextKey lock来实现。

mysql的悲观锁实现?

mysql加锁是通过锁住索引来实现的,如果没有索引和主键则会锁住整张表。mysql是通过record lock、Gap lock和next-key lock来实现加锁策略的。

  • Record lock:对行进行加锁
  • Gap lock:对间隙进行加锁
  • Next-key lock:Record lock+Gap lock的统称,innodb的默认实现方案;

InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行 锁。

mysql默认是autocommit提交事务,如果需要对select语句加锁,需要使用手动设置加锁操作。手动设置加锁的步骤:

begin;
Select * from xxx where xxx for update//加上for update进行强制加写锁;
select * from xxx where xxx lock in share mode//加上lock in share mode进行强制加读锁
进行各种操作//这样的话在还么有commit之前,该行记录一直处于锁定状态;
commit;

mysql的乐观锁mvcc机制原理?

mysql是通过mvcc机制来实现乐观锁的。mvcc是一种不加锁的方式解决读写冲突的机制,支持mysql上了写锁,还能继续支持读,解决读操作阻塞写操作的问题。在mysql中对一行记录的读写,默认使用的是mvcc机制,避免频繁使用加锁机制影响性能。

主要通过隐含字段undo日志read view来实现。核心思想是在select查询操作前生成一个read view(一致性读视图)中事务id的大小,用来判断是否需要从undo日志组成的版本链中读取历史数据。

  • 隐藏字段:每一条记录都会隐藏row_id、trx_id、roll_ptr。
  • undo日志:mysql中的undo日志记录操作前的状态,可以实现回滚到之前状态。
  • read view:mysql中存在当前读和快照读的概念,mvcc是通过快照读来实现多线程并发操作的,每次进行读操作时,会生成一个read view,读取之后比较事务id的大小来判断是否进行了一致性读。

mysql本身如何处理死锁问题?

Mysql目前机制是死锁超时会退出,将持有最少行级互斥锁的事务回滚。针对mysql无法自己解决的死锁问题,需要通过线程日志找到发生死锁的线程id,再通过kill 杀掉发生死锁的线程。

如何避免死锁?

问题说明:

两个或多个事务占用同一个共享资源,并且互相请求对方资源的锁,这样就会造成死锁。比如事务A请求事务B加锁的数据,同时事务B请求事务A加锁的数据,这样就会形成死锁情况。

解决方案:

  1. 让数据的查询尽量索引完成,避免索引加锁失败,从行级锁升级成表锁。
  2. 保持事务的顺序执行;
  3. 尽量减少查询范围,避免间隙锁加锁的范围;
  4. 事务执行逻辑简短,减少加锁时间;
  5. 死锁检测。执行之前做循环引用的检测。

Mysql只操作一条记录也有可能发生死锁吗?

有可能。Mysql的加锁对象是索引而不是记录,所以当一个事务对该记录的非主键索引加锁,并请求主键索引的锁,但另一个事务对该记录的主键索引已加锁,并请求该记录的非主键索引的锁,那么就会进入死锁状态。

如何优化事务

  1. 将数据处理工作放在事务外进行,缩短在事务中执行的时间;
  2. 不要一次性创建逻辑流程太长的事务,将这些事务拆分成多个小事务;
  3. 事务中不要进行RPC等耗时较长的操作,调用超时可能导致事务超时;

    本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询优化器内核剖析第一篇

SQL Server 的查询优化器是一个基于成本的优化器。它为一个给定的查询分析出很多的候 选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行。实际上, 因为查询优化器不可能对每一个产生的候选计划进行优化&#xff…

2023-8-31 spfa求最短路

题目链接&#xff1a;spfa求最短路 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], w[N], e[N], ne[N], idx;int dist[N]; bool st[N];void add(int a…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

引言&#xff1a; 近年来&#xff0c;网络安全威胁不断演变&#xff0c; 360 勒索病毒作为其中的一种恶意软件&#xff0c;已经对许多个人和组织的数据造成了巨大的损失。本文91数据恢复将介绍 360 勒索病毒的特点&#xff0c;探讨恢复被其加密的数据的方法&#xff0c;并分享一…

ctfshow 红包题

前言&#xff1a; 最近一直在搞java很少刷题&#xff0c;看见ctfshow的活动赶紧来复现一波~ ctfshow 红包挑战7 <?php highlight_file(__FILE__); error_reporting(2); extract($_GET); ini_set($name,$value); system("ls ".filter($_GET[1])."" )…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

R语言图形的组合( par(),layout(),par(fig()) )

引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据&#xff0c;需要可自取 链接&#xff1a;https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…

FFDNet-pytorch版本代码训练教程

一、FFDNet-pytorch版本代码下载 (1)FFDNet-pytorch下载 https://download.csdn.net/download/qq_41104871/88233742 (2)FFDNet-pytorch版本代码运行环境配置 https://blog.csdn.net/qq_41104871/article/details/132497008 二、FFDNet-pytorch版本代码训练教程 (1)按…

H桥驱动电路的反向电动势的吸收

下图是应用于智能灌溉系统驱动脉冲电动阀的H桥电路&#xff0c;有一个小问题。 H桥驱动电路 由于电动阀的线圈呈现感性。当正向或者反向驱动信号断开时&#xff0c;流过线圈的电流不能突变。 在线圈两端会产生与驱动信号反相的反向电动势。 驱动信号断开时&#xff0c;线圈产生…

是否在业务中使用大语言模型?

ChatGPT取得了巨大的成功&#xff0c;在短短一个月内就获得了1亿用户&#xff0c;并激发了企业和专业人士对如何在他们的组织中利用这一工具的兴趣和好奇心。 但LLM究竟是什么&#xff0c;它们如何使你的企业受益?它只是一种炒作&#xff0c;还是会长期存在? 在这篇文章中我…

行业追踪,2023-08-31

自动复盘 2023-08-31 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

记录生僻字编码问题

目录 生僻字消失?hexdump 生僻字消失? 前段时间遇到一个问题&#xff0c;对方系统确认推送的文件里客户姓名为3个字&#xff1a;倪明&#xff0c;中间字如下&#xff1a; PS: 忽略上面的编码哈&#xff0c;只看汉字 且文件为UTF8格式&#xff0c;本系统接收后转码为GB18030…

BMC相关知识

简介 BMC&#xff08;Baseboard Management Controller&#xff09;&#xff0c;基板管理控制器&#xff0c;普通PC没有&#xff0c;服务器产品必备。BMC是一个独立的系统&#xff0c;只要通电即可运行&#xff0c;服务器无需开机&#xff0c;不依赖其它软硬件&#xff0c;如O…

代价高昂的 IT 错误:识别并避免供应商锁定

陷入不提供所需服务的云服务器合同中可能会非常痛苦、令人沮丧且成本高昂。 供应商锁定是提供商难以切换的地方&#xff0c;这意味着企业迁移到新供应商的成本太高、破坏性太大或耗时。 这使得公司受到供应商的摆布&#xff0c;尽管该服务可能无法提供他们所需的可靠性或可扩…

解决“Windows Terminal软件报0xd000003a“问题

在2019年5月&#xff0c;微软发布第一个版本的Microsoft Terminal软件&#xff0c;支持tab分页、Shell脚本、bat脚本等。Terminal比DOS更方便&#xff0c;命令也更丰富&#xff0c;支持UTF-8字体、主题样式定制、窗格、快捷方式等等。     在win10上&#xff0c;打开Microsof…

PSP - 蛋白质结构预测 OpenFold Multimer 重构训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132602155 OpenFold Multimer 在训练过程的数据加载时&#xff0c;需要将 MSA 与 Template 信息转换成 Feature&#xff0c;再进行训练&#xff0…

【源码】智能导诊系统:医疗行业的变革者

智能导诊系统源码&#xff0c;3D人体导诊系统源码 随着科技的迅速发展&#xff0c;人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中&#xff0c;智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用&#xff0c…

计算机毕业设计之基于Python+MySQL的健身房管理系统(文档+源码+部署教程)

系统主要采用python技术和MySQL数据库技术以及Django框架进行开发。系统主要包括个人中心、用户管理、教练管理、健身课程管理、健身器材管理、健身记录管理、身体数据管理、在线留言、系统管理、订单管理等功能&#xff0c;从而实现智能化的健身房管理方式&#xff0c;提高健身…

DatenLord前沿技术分享No.34

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…

Jenkins测试报告样式优化

方式一&#xff1a;修改Content Security Policy&#xff08;临时解决&#xff0c;Jenkins重启后失效) 1、jenkins首页—>ManageJenkins—>Tools and Actions标题下—>Script Console 2、粘贴脚本输入框中&#xff1a;System.setProperty("hudson.model.Directo…