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.mzph.cn/news/776974.shtml

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

相关文章

多线程之并发变成高级面试题-2024

有三个线程T1,T2,T3,如何保证顺序执行 使用 join() 方法: 可以在每个线程内部使用 join() 方法来等待前一个线程执行完成。具体操作是在线程 T2 的 run() 方法中调用 T1.join(),在线程 T3 的 run() 方法中调用 T2.join()。这样可以确保 T1 在 T2 之前执…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下,说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导],创建一个Demo工程,选择Stage模型 鸿蒙OS开发更多内容↓点击…

图像识别在工业检测中的应用

图像识别技术在工业检测中的应用非常广泛,它通过自动化的图像处理和分析,提高了生产效率、保证了产品质量,并降低了人力成本。以下是图像识别在工业检测中的一些主要应用领域: 缺陷检测:在制造业中,图像识…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算,四道二维dp 67.二进制…

PCB损耗来源

信号经过PCB板会产生损耗,主要包括导体损耗,介电损耗和辐射损耗 导体损耗:导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗:介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗:辐…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址:YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub:WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

定时备份mysql数据库数据--mysqldump版

前言:mysqldump是MySQL自带的逻辑备份工具,可以将整个数据库或者指定的表格导出为一个SQL脚本文件,可以用于数据库备份。 1、编写shell脚本 # 备份文件保存路径 backup_dir/data/mysqlbackup # 当前时间 current_timedate %Y-%m-%d-%H-%M-%S…

git 更改仓库地址

背景: 项目本来在A仓库进行保管,研发已经开发一段时间了,现在切换到了新的仓库B,研发本地如何将仓库切换到B 解决: # 查看远端地址 git remote -v # 查看远端仓库名 git remote # 重新设置远程仓库 git remote s…

Linux---多线程(下)

前情提要:Linux---多线程(上) 七、互斥 临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行,但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

3.28(迭代搜索算法 + java学习总结)

迭代加深搜索 迭代加深算法是一在DFS的基础上添加搜索深度限制的搜索方法; 其核心思想是从深度为0的地方开始搜索,然后逐步加深搜索深度,重新搜索一遍;这对于那些已知答案在浅层,但整个树或图存在极多分支的情况&#…

Selenium自动化测试:从time.sleep到显式等待的转变

在自动化测试的神秘世界里,我们的英雄——Selenium驾驶者,面临着一个古老的难题:如何等待?当然,最简单的法术是time.sleep,但这就像用锤子敲打每一个螺丝——有时候行得通,但并不总是最好的选择…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程(附代码资料)主要内容讲述:vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计,人力资源的环境搭建vue-element-admin的了解和…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息,可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档,刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中,使用上面的输出函数就可以查看到有关于请求…

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…

Qt 窗口MainWindow(上)

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、多个浮动窗口&#xff08;…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

安防监控视频汇聚平台EasyCVR启用图形验证码之后如何调用login接口?

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

【Vue】可拖拽侧边栏实现

在本篇博客中&#xff0c;我们将探讨如何在 Vue.js 项目中实现一个可拖拽的侧边栏。此功能可以通过修改 HTML 和 Vue 组件的脚本来实现。 首先&#xff0c;我们需要在 HTML 文件中定义侧边栏的容器和用于拖拽的元素。在 Vue 组件中&#xff0c;我们将使用 Vue 的响应式系统来追…

Android JNI开发定义全局变量

要在 C 文件中设置一个 string 类型的全局变量&#xff0c;让其他 C 文件都可以访问&#xff0c;并且可以通过 JNI 方法修改这个变量&#xff0c;可以按照以下步骤进行操作 定义全局变量&#xff1a; 在一个头文件&#xff08;比如 common.h&#xff09;中定义一个全局的 strin…