当前位置: 首页 > news >正文

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;

总结

在这里插入图片描述

相关文章:

  • Neo4j桌面版导入CVS文件
  • 利用瑞士军刀netcat建立连接并实现文件上传
  • 从姿态估计到3D动画
  • 1.7.2 python练习题15道
  • C++超市商品管理系统
  • 计算机网络基础——网络安全/ 网络通信介质
  • 大学 Python 程序设计实验报告:判断变量名是否合法
  • XSKY 智能存储,助力“数据要素 X”先进制造
  • openGauss Index-advisor_索引推荐
  • docker 的八大技术架构(图解)
  • 【Web前端】CSS基本语法规范和引入方式常见选择器用法常见元素属性
  • Android 观察者模式
  • 【KMeans聚类概述】
  • HTTPS握手解析
  • 智慧公厕的技术融合策略
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 0基础学习移动端适配
  • 10个确保微服务与容器安全的最佳实践
  • 30秒的PHP代码片段(1)数组 - Array
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • AHK 中 = 和 == 等比较运算符的用法
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6简单总结(搭配简单的讲解和小案例)
  • maya建模与骨骼动画快速实现人工鱼
  • mockjs让前端开发独立于后端
  • OSS Web直传 (文件图片)
  • Python利用正则抓取网页内容保存到本地
  • swift基础之_对象 实例方法 对象方法。
  • 关于 Cirru Editor 存储格式
  • 聚类分析——Kmeans
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微信小程序填坑清单
  • 智能网联汽车信息安全
  • 最简单的无缝轮播
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #stm32驱动外设模块总结w5500模块
  • (1)STL算法之遍历容器
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十) 初识 Docker file
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)用.Net的File控件上传文件的解决方案
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET NPOI导出Excel详解
  • .sh 的运行
  • .skip() 和 .only() 的使用
  • ?