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

mysql (事物)

一.什么是事物

 事物是一组操作的集合,不可分割的工作单位,事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求,就是这些操作要么一起成功要么一起失败。

二.事物操作 (这个就是一个理解)

 1.事务特性
 原子性Atomicity:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性Consistency:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。例如:转账前和转账后的总金额不变。

隔离性Isolation:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务执行时,不能被其他事务的执行所干扰,多个并发执行的事务之间要相互隔离。(通过事务的隔离级别保证隔离性)

持久性Durability:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

2.事物的隔离级别会产生的问题

脏读:读取其他事物未提交的数据 

不可重复度:读取其他事物已经提交修改

幻读:读取其他事务插入的操作

下面有具体设置隔离级别的案例

扩展:这个说的是原子性和隔离性没有关系

通过以下命令查看MySQL事物的提交方式

select @@autocommit

1是自动提交  0是手动提交

mysql中的事物默认自动提交。

可以将mysql中的事物设置为手动提交。

  2.1查看/设置事物的提交方式

       创建表并插入数据

       CREATE TABLE `test_01` (
       `id` int DEFAULT NULL COMMENT '主见id',
       `name` varchar(10) DEFAULT NULL COMMENT '姓名',
       `money` int DEFAULT NULL COMMENT '金额'
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci             COMMENT='测试表';

         INSERT INTO test_01 (id,name,money) 
         VALUES (1,'张三',2000), (2,'李四',2000);

  2.2提交事务

  2.3回滚事物

三.脏读,幻读,不可重复读

  脏读过程的理解(切换事物的隔离级别,不同的隔离级别会导致数据的脏读,幻读,不可重复读)

 第一个窗口中查询的数据

 第二个窗口中查询的数据

第一个窗口中开启事物

第二个窗口中开启事物

第一个窗口中开启事物后的查询

第二个窗口中开启事物后的修改并查询

第一个窗口在开启事物后,查询第二个窗口在开启事物并修改数据后的查询

第二个窗口提交事物并查询

第一个窗口在第二个窗口提交事物后,第一个窗口没有提交事物的查询

第一个窗口在提交事物后的查询

总结:在没有关闭inndb自动提交事物和关闭inndb自动提交事物的情况下,都没有发生脏读的情况,都是在各自的窗口中执行各自的操作,另一个窗口的操作并不会对其他窗口有影响。就算是操作(修改,删除,插入)后提交了事物,也不会对其他事物还在进行中的数据有影响。大招(因为我们默认用的隔离级别是 可重复读 (Repeatable read 可重复读) 不会发生 脏读,幻读,不可重复读)

这条查询会返回全局和会话级别的事务隔离级别。全局级别代表服务器级别的默认隔离级别,而会话级别代表当前连接会话的隔离级别。

执行这条查询将返回类似以下的输出:

 SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;

mysql8设置隔离级别

在MySQL 8中,您可以使用SET TRANSACTION语句来设置事务的隔离级别。以下是几个常见的隔离级别设置示例:

1.设置为读未提交(Read Uncommitted):

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.设置为读已提交(Read Committed):

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

3.设置为可重复读(Repeatable Read):

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4.设置为串行化(Serializable):

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

请注意,设置隔离级别必须在启动事务(使用START TRANSACTION)之前进行。一旦事务开始,隔离级别就无法更改。

此外,也可以在MySQL配置文件(通常是my.cnfmy.ini)中设置默认的全局隔离级别,或者为单个会话设置隔离级别。这样做可以影响所有新的连接和事务,不必在每次开始事务时都进行设置。

四.隔离级别的具体实现

参考视频:MySQL事务和锁机制详解_哔哩哔哩_bilibili

事物具体的实现方式

原子性,一致性,持久性 通过redo log 和 undo log 实现

隔离性 通过锁和mvcc(多版本控制)实现

就到这,重新写一篇具体的实现

相关文章:

  • java计算年化利率
  • 智能合约漏洞类型
  • MySQL之查询性能优化(十一)
  • ffmpeg实现视频播放 ----------- Javacv
  • WebGL开发时尚设计系统
  • 一文讲清:生产报工系统的功能、报价以及如何选择
  • zerotier自建moon方法
  • Less的简单总结
  • bugku---misc---ping
  • 第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
  • Accelerate之大模型显存计算
  • 防止连续点击按钮,多次调用接口
  • 俄语演讲开场白,柯桥外贸俄语培训
  • 提升易用性,OceanBase生态管控产品的“从小到大”
  • 第六章:C++之设计模式(一)
  • Android Volley源码解析
  • HTML-表单
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java精华积累:初学者都应该搞懂的问题
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Lucene解析 - 基本概念
  • miaov-React 最佳入门
  • MySQL QA
  • MySQL几个简单SQL的优化
  • Octave 入门
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • react-native 安卓真机环境搭建
  • 编写高质量JavaScript代码之并发
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对象管理器(defineProperty)学习笔记
  • 高程读书笔记 第六章 面向对象程序设计
  • 给Prometheus造假数据的方法
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何在GitHub上创建个人博客
  • 手写一个CommonJS打包工具(一)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 数据可视化之下发图实践
  • ​2020 年大前端技术趋势解读
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (13)DroneCAN 适配器节点(一)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (规划)24届春招和25届暑假实习路线准备规划
  • (简单) HDU 2612 Find a way,BFS。
  • (转) Face-Resources
  • (转)Scala的“=”符号简介
  • (转)setTimeout 和 setInterval 的区别