mysql的事务和锁

news2024/12/25 22:04:37

【MySQL事务和锁】

学习原文:https://blog.csdn.net/zly03/article/details/127170995
事务四大特性:原子性、一致性、隔离性、持久性,简称ACID

MySQL中支持3种不同的存储引擎:
MyISAM存储引擎、Memory存储引擎、和InnoDB存储引擎
注:只有InnoDB才支持事务。

事务的控制语句

begin或者start transaction 开启一个事务
commit 或者 commit work 提交事务,进行持久性修改
rollback 或者 rollback work 回滚事务,撤销已经进行修改但未提交的操作
savepoint [保存点] 在事务中创建一个保存点,一个事务可以有多个保存点
releasavepoint [保存点] 回滚到指定的保存点
set transaction 设置事务的隔离级别

事务隔离级别设置
读未提交(READ-UNCOMMITTED)
读已提交(READ-COMMITTED)
可重复读(RE-PEATABLE-READ)
可序列化读(SERIALIZABLE)

【脏读】

两个用户的账号都为100元。
分别打开两个连接mysql的会话窗口:
a会话隔离级别READ-UNCOMMITED
b会话隔离级别采用默认,为可重复读。开启事务,并执行lisi给zhangsan转账100元。

在a会话查看zhangsan已经收到钱,但实际上b会话中lisi的事务还没提交
假如这个时候,lisi不想转账回滚事务,那a会话的zhangsan就读到脏数据。

个人理解:
事务期间的操作被其他会话看见。

【不可重复读】

将a会话中zhangsan的事务隔离级别设置成READ-COMMITTED
在两个窗口都开启事务

假设a会话中zhangsan想统计全部人的钱有多少,假定为200;
这时b会话的lisi往账户里面存了100元,并提交事务。
这时,zhangsan再次查询总和,查询总金额300,但这次查询对于a会话来说是处于同一事务,查询到两次不一样的结果。
属于不可重复读。

个人理解:
一个事务中查询两次,两次的结果不一致。

【幻读】

为了解决不可重复读的问题,将事务的隔离等级设置为默认值REPEATABLE-READ
两边都开启事务。

先在一个窗口插入一条数据并提交,然后在另外一个窗口查看,此时查询不到该记录,
这时新插入一条记录,主键和刚插入的记录的主键相同。
插入不进去,报错为:主键重复

算是一种幻读,如果要解决幻读,可将事务隔离等级设置为SERIALIZABLE

【锁机制】

InnoDB的行锁
InnoDB默认采用行锁,分为以下这两种,分别为共享锁和排他锁。

这两个概念我在这篇文章中也有介绍。

共享锁(S锁):该事务可以读取但不能修改数据。其他事务可以在该对象上加共享锁,但不能修改数据。
排他锁(X锁):一个数据对象只有一把排他锁,获取到该锁的事务可以读取数据和修改数据。

一般的查询语句不会加任何的锁。
当然也可以为数据加锁
select * from … for update,为数据添加排他锁,
select … lock in share mode 为数据添加共享锁。

【锁实战】

首先关闭事务自动提交
set autocommit=0;
先在一个窗口输入一条获取到排他锁
(虽然操作的是一条数据,但是锁的是整张表,因为没有添加索引)
select * from user where user=‘zly1’ for update;

对user这一列添加索引,就可以看到对其进行加锁就不会出现阻塞的情况。
alter table user add index(user);

注:
在MySQL的行级锁是针对索引中的行加锁,而不是针对表中的行加锁。
访问不同行如果不存在对应的索引,或者使用相同的索引,就会造成锁冲突而锁住整表。

【死锁】

死锁是指两个或者两个以上的额事务在执行过程中,因为互相的等待或者因为争抢相同的资源而造成的互相等待现象。
将事务的自动提交关闭掉。
首先先在会话1中,更新id为1的记录,然后在会话2中更新id为2的记录。
这时再回来在会话1更新id为2的记录,在会话2中更新id为1的记录。
产生死锁。
在这里插入图片描述

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

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

相关文章

CMake使用外部动态库/静态库和头文件

CMake使用外部动态库/静态库和头文件一、准备工作二、新建一个新的CMake工程三、开始构建四、为target添加共享库五、链接静态库一、准备工作 在博文《使用CMake构建静态库和动态库》中已经介绍了libhello动态库的构建和安装,现在我们看看如何使用这个外部动态库。…

iOS 15.0+ 中 SwiftUI 顶部或底部悬浮功能小面板的极简实现

功能需求 我们有时需要在 App 主视图的顶部或底部固定悬浮放置一个功能视图: 如上图所示,我们将一个列表项目输入小面板按需放在主视图的顶部或底部: 当放置在顶部时,解决了其对导航栏(NavigationView)中 toolbar 内容的遮挡问题;当放置在底部时,考虑到了其对列表最后…

spring boot 实现搜索引擎的设计思想

目录 实现思路 索引模块 预处理 对文档进行分词 搜索模块 实现思路 索引构建模块 搜索模块 数据库模块 索引模块 对于搜索一个东西,我们很自然的能想到遍历去查找。比如我要查找一本书叫 《红楼梦》,那么我直接在所有结果中进行遍历查找&#xff…

druid解析-过滤器详解

druid支持过滤器,可以在获取连接或者调用连接对象的方法时,先调用过滤器,之后再执行底层方法,比如DruidDataSource的getConnection()方法: public DruidPooledConnection getConnection(long maxWaitMillis) throws SQ…

网络安全一哥的奇安信发布了全球高级可持续威胁年度报告 值得学习

声明 本文是学习全球高级持续性威胁 APT 2021年度报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 中国境内高级持续性威胁综述 基于中国境内海量DNS域名解析和奇安信威胁情报中心失陷检测(IOC)库的碰撞分析&…

9_1、Java基本语法之常用类String、StringBuffer、StringBuilder的使用

一、String的使用及常用方法 1、概述 String:表示字符串,使用""引起来。 1.1、String类是声明为final的,不可被继承。 1.2、String类实现了Serializable接口,表示字符串支持序列化。 …

【王道操作系统】2.1.3 原语实现对进程的控制

原语实现对进程的控制 文章目录原语实现对进程的控制1.什么是进程控制2.原语实现对进程的控制3.回忆进程的组织4.进程控制大致图解5.进程控制原语的相同点6.进程控制的五种原语1.什么是进程控制 2.原语实现对进程的控制 3.回忆进程的组织 4.进程控制大致图解 这里说明一下调度和…

MySQL【AUTO_INCREMENT 】自增列

使用案例场景再现: 创建一个为test的数据库,为数据库test创建一个数据表student ,其中包含的字段有 id name sex,admission_time,其中要求student表中的人员id必须连续排列。 create database test use test cr…

SCI论文解读复现【NO.1】基于Transformer-YOLOv5的侧扫声纳图像水下海洋目标实时检测

此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,帮助…

三旗舰焕新发布引领品牌向上 长城汽车登陆2022广州车展

近日,长城汽车携哈弗、魏牌、欧拉、坦克、长城炮以及沙龙六大品牌,登陆第二十届广州国际汽车展览会(以下简称“2022广州车展”)。魏牌全新旗舰蓝山DHT-PHEV、坦克500 PHEV长续航版、大型高性能豪华皮卡山海炮等车型联袂而至&#…

创建静态库存文件 ansible(3)

目录 创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: (1)node1是dev主机组的成员 (2)node2是test主机组的成员 (3)node1和node2是prod主机组的成员 (4&am…

【Qt】控件——QPlainTextEdit使用简单介绍:常用方法及信号、逐行读取编辑框的内容、使用自带的快捷菜单、作为日志显示窗口

Qt控件-QPlainTextEdit使用 参考链接: https://blog.csdn.net/seniorwizard/article/details/109726147; https://blog.csdn.net/seniorwizard/article/details/109726147 文章目录Qt控件-QPlainTextEdit使用QPlainTextEdit控件简单介绍1. 逐行读取文本编辑框的内容…

【PCB专题】什么是金属化孔(PTH)和非金属化孔(NPTH)

计出来的,并不是放在那里好看的,每个不同的孔洞都有其目的。一般来说孔洞越多,PCB的成本也越高。 PCB中的孔类型大体上可以被区分为PTH(Plating Through Hole)电镀导通孔,和NPTH(None Plating Through Hole)非电镀导通孔两大类。这里说的通孔是指从PCB的一面直接贯穿到…

Spark数据倾斜性能调优

目录 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 某个task执行特别慢的情况 某个task莫名其妙内存溢出的情况 查看导致数据倾斜的key的数据分布情况 知识拓展 coalesce 和 repartition 的区别 数据倾斜的解决方案 解决方案一&am…

【哈工大大一年度项目经验与感想】立项篇 中(2021.9.17~2021.11.17)

第四步:立项报告书写 立项报告的目的在于向答辩老师或者投资方阐述你的项目是什么?做什么的?解决什么问题?打算怎么解决这些问题?有什么创新点、特色?目标?所以一篇立项报告正文需要包括以下内容…

21级数据结构考前模拟题

说明: 此试卷为21级数据结构考前模拟题,老师并未给出标准答案,故以下所有答案均为博主给出,并只供参考,不保证其正确性!!! 只更新了部分,还在写题中!&#xf…

同步+异步日志系统(C++实现)

对于一个服务器而言,不论是在调试中还是在运行中,都需要通过打日志的方式来记录程序的运行情况。本文设计的日志系统实现了同步与异步两种功能,原理见下图: 同步日志:日志写入函数与工作线程串行执行,由于涉…

人脸识别与美颜算法实战-基于机器学习的人脸识别

机器学习根据输出的类型一般分为两类,分类和回归。分类的输出一般是离散值,回归输出的值一般是连续的。比如,人脸识别这种就属于分类问题,房价预测一般是一个回归问题。 鸢尾花分类 # -*- coding: UTF-8 -*- # 导入数据集 from sklearn.datasets import load_iris iris =…

InnoDB事务原理理解(redo log,undo log,锁,MVCC的理解)

目录事务事务的四大特性ACID事务相关SQL语句事务原理事务如何解决隔离性隔离性总结事务如何解决原子性、一致性、持久性redo log 重做日志CheckPoint 检查点机制Double Writer 双写磁盘undo log 回滚日志锁表级锁表读锁、表写锁元数据锁MDL意向锁行级锁行读锁,行写锁…

coremail邮件安全网关产品详细学习笔记(上)

声明 本文是学习中国企业邮箱安全性研究报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 钓鱼邮件 钓鱼邮件的规模 在本章内容中,钓鱼邮件是指含有恶意欺诈信息的邮件,包括OA钓鱼邮件、鱼叉邮件、钓鲸邮件、CEO仿…