mysql--事务四大特性与隔离级别

事务四大特性与隔离级别

  • mysql事务的概念
    • 事务的属性
    • 事务控制语句
    • 转账示例
  • 并发事务引发的问题
    • 脏读
      • 脏读场景
    • 不可重复读
    • 幻读
      • 幻读场景
  • 事务的隔离级别
    • 读未提交
    • 读已提交
    • 可重复读(MySQL默认)
  • 总结

mysql事务的概念

事务就是一组操作的集合,他是一个不可分割的整体,事务会把所有的操作作为一个整体一起向系统提交或撤销操作。

在这里插入图片描述

事务的属性

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)
    在这里插入图片描述

事务控制语句

  • 查看/设置事务提交
START TRANSACTION;
  • 提交一个事务
COMMIT;
  • 回滚一个事务
ROLLBACK;

1为自动提交,0位手动提交。
msyql默认为自动提交,需要手动设置为手动提交。
执行成功时,进行commit提交事务,程序出时是进行回滚事务

转账示例

-- 关闭自动提交
SET AUTOCOMMIT = 0;-- 开始事务
START TRANSACTION;-- 查询张三和李四的余额
SELECT balance INTO @zhangsan_balance FROM accounts WHERE name = '张三';
SELECT balance INTO @lisi_balance FROM accounts WHERE name = '李四';-- 如果张三的余额足够,进行转账操作
IF @zhangsan_balance >= 1000 THEN-- 更新张三和李四的余额UPDATE accounts SET balance = balance - 1000 WHERE name = '张三';UPDATE accounts SET balance = balance + 1000 WHERE name = '李四';-- 提交事务COMMIT;SELECT '转账成功';
ELSE-- 回滚事务ROLLBACK;SELECT '转账失败,张三余额不足';
END IF;-- 开启自动提交
SET AUTOCOMMIT = 1;

并发事务引发的问题

在这里插入图片描述

脏读

脏读(Dirty Read)是指一个事务在读取另一个未提交的事务所做的修改时,产生不一致的结果。具体来说,当一个事务读取了另一个事务未提交的数据,然后这个未提交的数据被回滚了,那么读取到的数据就是脏数据,因为它实际上不应该存在于数据库中。

在这里插入图片描述

脏读场景

假设有两个用户:A 和 B。用户 A 有 1000 元,用户 B 有 2000 元。现在 A 从自己的账户中转账 500 元到 B 的账户。

  1. 初始状态

用户 A 的账户余额为 1000 元。
用户 B 的账户余额为 2000 元。

  1. 转账操作

用户 A 开始一个事务,从自己的账户中扣除 500 元。
用户 B 开始一个事务,将 500 元存入自己的账户。

  1. 脏读

用户 B 在事务中读取自己的账户余额,发现账户余额变成了 2500 元(未提交的转账操作)。
用户 A 的转账操作因为某种原因失败,并回滚了。

  1. 结果

用户 B 实际上没有收到任何转账,但是由于脏读,他错误地读取到了自己账户的余额为 2500 元,这是一个不一致的状态。

不可重复读

事务A在第一步查询了id为1的数据,然后事务B修改id为1的数据并且提交了数据,然后事务A在第三步又查询了id为1的数据,发现两次查询的数据不一致。
在这里插入图片描述

幻读

幻读(Phantom Read)是并发事务可能遇到的另一种问题,也涉及到事务隔离性。幻读场景指的是在一个事务中多次执行相同的查询,但在不同的查询中返回了不同数量的行。

在这里插入图片描述

幻读场景

  • 事务T1执行了一个查询,返回了一组满足某个条件的行。
  • 事务T2插入了一些新的行,这些行也满足了T1查询中的条件,并且提交了事务。
  • 事务T1再次执行相同的查询,但这次返回的结果集比之前多了新插入的行,导致得到了不一致的结果。

事务的隔离级别

在这里插入图片描述

对号表示问题会出现,X白表示问题已解决。
串行化·:安全性高,效率低。
读未提交:效率最高,但是安全性最低

读未提交

-- 事务T1
START TRANSACTION;-- 事务T2
START TRANSACTION;-- T2更新了某行数据
UPDATE table_name SET column1 = new_value WHERE condition;-- T1读取T2尚未提交的数据
SELECT * FROM table_name WHERE condition;-- T2提交
COMMIT;-- T1继续
-- T1读取了已提交的数据
SELECT * FROM table_name WHERE condition;-- T1提交
COMMIT;

读已提交

-- 事务T1
START TRANSACTION;-- 事务T2
START TRANSACTION;-- T2更新了某行数据
UPDATE table_name SET column1 = new_value WHERE condition;-- T2提交
COMMIT;-- T1读取T2已提交的数据
SELECT * FROM table_name WHERE condition;-- T1提交
COMMIT;

可重复读(MySQL默认)

-- 事务T1
START TRANSACTION;-- 事务T2
START TRANSACTION;-- T2更新了某行数据
UPDATE table_name SET column1 = new_value WHERE condition;-- T2提交
COMMIT;-- T1再次读取T2修改的数据,但是在可重复读级别下,T1看到的数据仍然是之前启动事务时的快照数据
SELECT * FROM table_name WHERE condition;-- T1提交
COMMIT;

总结

在这里插入图片描述

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

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

相关文章

深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自:设计模式深度解析:深入浅出的揭秘游标尺模式与迭代…

智能车主控板原理图原理讲解

智能车主控板原理图原理讲解 综述:本篇文章对智能车主控板的一部分电路进行原理分析,文末附加整体原理图。 1. 电源电路 (1)通过外接电池供电并通过电源模块电路,运用稳压芯片lm2940,将电源电压转化为5V…

2024年天府杯A题论文免费分享,全网首发

天府杯免费分享资料(A题论文代码)链接:https://pan.baidu.com/s/17QtYt036ORk1xGIDi0JSew 提取码:sxjm 摘要 在近年来,随着科技的快速发展和社会经济的不断进步,科学研究的作用和地位日益凸显。本文基于…

MYSQL数字函数:不可不知的数据处理利器

🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀转载自:MYSQL数字函数:不可不知的数据处理利器 ✨ MYSQL数字…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…

最小可行架构实践:创建家庭保险聊天机器人——可持续架构(四)

前言 即使像聊天机器人这样的简单应用也需要一个最小可行产品(MVP)和最小可行架构(MVA),因为正确开发聊天机器人应用并不容易,而开发失败可能会极大地影响客户满意度。MVP是产品开发策略的一个有用组成部分…

Linux内核之最核心数据结构之一:struct file(三十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件,以其强大的功能和用户友好的界面,为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载:SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

电子负载的使用

一,电子负载的介绍 1、电子负载简介和应用 我们通常说的电子负载,其实是一个假负载,充当我们的负载,比如灯头,电机等等。它是一种直流可编程电子负载,首先是直流模式的,可编程是内部写入程序&…

1.java openCV4.x 入门-环境搭建

专栏简介 💒个人主页 📖心灵鸡汤📖大家 📰专栏目录 点击上方查看更多内容 环境搭建 一、开发环境二、环境搭建1.openCV安装1.下载程序包 2.程序包安装3.搭建项目 三、非必要资源1.扩展库2.cmake 一、开发环境 开发工具 i…

2024年北京事业单位报名照片要求,注意格式

2024年北京事业单位报名照片要求,注意格式

C++:类与对象(下)

目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 二、 static成员 2.1 概念 2.2 特性 三、友元 3.1 友元函数 3.2 友元类 四、内部类 五、匿名对象 六、拷贝对象时的一些编译器优化 七、再次理解类和对象 一、再谈构造函数 1.1 构造…