MySQL数据库之事物(详解)

简介: MySQL数据库之事物(详解)

一.事物的概念

        在MySQL中,数据库事物支持是在引擎层实现的,我们知道,MySQL是一个支持多引擎的系统,但不是所有的引擎都支持事物,比如MySQL原生的MyISAM引擎就不支持事物,这也是MyISAM被InoDB代替的重要原因之一。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

数据库的事务(Transaction): 指一系列数据库操作作为一个逻辑单元执行的过程。事务可以确保数据库中的数据一致性和完整性。

本质:将多个操作打包为1个操作来完成,要么成功,要么失败。

事物的优点:可以确保数据库操作的可靠性,并提高数据的安全性和可靠性。

二.为什么需要事物

       在现实生活当中,我们经常会有转账的行为,假设:张三给李四转账1000元。而其实会有很多种问题产生,导致转账不成功。例如:

  • 张三的账户减少了1000元,李四的账户因为系统原因导致没有增加1000元
  • 转账完成时,系统故障,张三的账户未扣1000元
  • 在转账的时候,有他人给李四转账,导致李四账户异常

而把这种转账行为当作数据库的执行语句来看,很明显会出现巨大的问题,因此为了解决问题:提出了 事物 来控制,保证要么执行失败,要么执行成功。

三.事物的执行机制

       我们先假设事物有3个操作,分别为操作1、操作2、操作3.在事物执行之前,我们无法判断是哪步操作会有故障,但是执行时发生故障时,会主动将前面的操作进行还原,也称回滚操作

  • 当操作一出现故障时,直接停止操作,告知分别为操作1、操作2、操作3.在事物执行之前,我们无法判断是哪步操作会有故障,但是执行时发生故障时,会主动将前面的操作进行还原,也称回滚操作
  • 当操作一出现故障时,直接停止操作,告知失败。记录下来,一旦需要回滚,按照日志将之前的操作进行“逆操作”来执行。

逆操作:若上一个操作是插入,逆操作就是删除、若上一个操作是删除,逆操作就是插入。

因此事物利用 原子性 通过回滚操作从日志中进行逆操作

四.MySQL的事物基本使用

先准备一个测试表:

create table test(
   id int primary key auto_increment,
     name varchar(20),
     sex varchar(20) );

现在进行事物的操作:

  1. 事物开启:start  transaction;
  2. 输入多个sql语句,作为事物的操作
  3. 以commit(提交) 或 rolllback(回滚)结尾

注:rollback即是全部失败,commit即是全部成功

代码操作:

mysql> start transaction;
mysql> insert into test(name,adress) values('tq02','男');
mysql> update text set sex='女' where name = 'tq01';
mysql>commit;

.事物的ACID特性

       事物具有四个特性,通常被称为ACID特性:

  1. 原子性(Atomicity):事务中的操作要么全部成功执行,要么全部失败回滚。如果其中任何一个操作失败,整个事务将被回滚到初始状态。
  2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。即,事务执行前后数据库的状态是一致的。
  3. 隔离性(Isolation):并发执行的多个事务之间是相互隔离的,每个事务对其他事务的操作是不可见的,直到事务提交。
  1. 持久性(Durability):一旦事务提交成功,其对数据库的修改将永久保存,即使发生系统故障也不会丢失。

5.1一致性

事物追求的根本是一致性,而破坏一致性主要来源于两个方面,事物的并发执行和事物故障或者系统故障。

事物的并发操作:两个或多个sql语句同时执行。

例如:一边查找张三的工资条、另一边让张三的工资提高500,那么查找出来的是张三涨还是没涨的工资呢?这就是使数据不存在一致性。

事物故障和系统故障:操作发生错误,通过回滚的方式回复。

结:

  • 数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
  • 并发控制保证事务的隔离性和一致性,日志恢复保证了原子性、持久性

六 事物的隔离级别

6.1事物隔离的原因及解决思路

   当多个用户同时访问数据库时(并发操作),每个事务的操作可能相互干扰,从而导致数据的混乱和不一致,而导致数据的混乱和不一致有3种原因:脏读、不可重复读、幻读


脏读(Dirty Read)问题:脏读是指一个事务在读取另一个事务未提交的数据时,导致数据不一致。。

抽象解释:当我在考试的时候,隔壁的人偷看了我的选择题答案,但是我在交卷前修改了,导致他读取我的答案时出错

解决方案:在事物未提交数据前加锁,防止其它事物读取,简称:写数据加锁。


不可重复读(Non-repeatable Read)问题:不可重复读是指在同一个事务中多次读取同一数据,但得到的结果却不一致。

抽象解释:当我在考试的时候,隔壁的人想偷看了我的选择题答案时,我立马修改答案,就无法读取我原来的答案了。

解决方案:事物读取也加锁,就是指其它事物无法更改数据。简称:读数据加锁


幻读(Phantom Read)问题:幻读是指一个事务在读取到某个范围内的数据后,另一个事务插入了新的数据,导致第一个事务再次读取时,发现有新增的数据。

抽象解释:当我在考试的时候,隔壁的人看我的选择题答案时,我不会修改选择题答案,但是我依然在写填空题答案,并且他也看得到我填空题答案。

解决方案:串行化,彻底放弃并发执行,所有事物变为一个一个顺序执行。

脏读--------->不可重复读--------->幻读,事务的隔离性在不断提高,但是并行不断降低。

注:并发控制就是有脏读、不可重复读、幻读的问题。

6.2MySQL事物的隔离级别

       MySQL数据库为了解决以上的问题,提出了4种事物隔离级别。分别为:read uncommitted、readcommitted、repeatable read、serializble


1.read uncommitted


       允许读未提交的数据,也就是一个事物可读取另一个事物未提交的数据,因此会发生脏读、不可重复读、幻读的情况。隔离性低,数据可靠性最低,并发程度最高。


2.read committed


       允许读取已经提交的数据,讲解了脏读的问题,给写操作加锁,但依然存在不可重复读和幻读的问题,隔离性提高了,并发程度降低,数据可靠性提高。


3repeatable read

       可以重复读取数据(写操作和读操作都加锁),讲解了脏读和不可重复读的问题,但是存在幻读的问题,隔离性又提高了,数据可靠性提高,并发性降低了。


4serializable


       事物彻底的变成了串行执行,解决了脏读、不可重复读、幻读的问题,隔离性最高,但是同样放弃了并发操作,数据可靠,效率也最低。


注:由于不同的隔离级别,拥有不同的特性,因此在实际操作里,我们需要根据实际需求场景类决定使用哪个隔离级别。




事物的注意点:需要知道为什么需要事物?事物的作用是什么?事物隔离的原因及其作用?


·                                                                                             ----------懒惰的tq02

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
5月前
|
人工智能 API 开发者
从开发视角看跨境电商自动化:技术栈演进与企业级Agent选型参考
本文探讨2026年跨境电商自动化技术选型关键问题:在API依赖与屏幕操作之间,如何抉择?对比传统ERP、开源自研与AI Agent三大路径,重点解析实在Agent、阿里Accio Work、悟空、遨虾等智能体架构与落地实践,提供可复用的决策框架。(239字)
|
人工智能 弹性计算 自动驾驶
阿里云张献涛:云原生计算基础设施助力汽车行业数字化升级
汽车行业在变化中积极拥抱数字化,阿里云帮助众多的汽车企业实现数字化升级,为汽车企业的电动化、数字化和智能化全面提速提供助力。2023年阿里云云峰会北京站《云上智能汽车》论坛中,阿里云智能基础产品部副总裁、阿里云智能弹性计算&无影产品线总经理张献涛,发表了《云原生计算基础设施助力汽车行业数字化升级》的主题演讲。
|
5月前
|
人工智能 IDE 开发工具
Qoder 1.0正式发布!从AI IDE迈向智能体自主开发工作台
阿里发布Qoder 1.0,从AI IDE升级为智能体自主开发工作台:用户只需定义需求,Agent团队即可“自动驾驶”,完成执行、验证与交付全流程。支持Windows/macOS/Linux,集成Quest独立视窗、跨项目并行、团队知识引擎及可定制专家团。
|
10月前
|
数据采集 安全 API
Python 实用标准库与工具函数使用指南
本文系统梳理Python高效开发三大利器:标准库(datetime、os等)、第三方库(requests、Pillow等)及自定义工具函数,结合高频场景与实操代码,助你避免重复造轮子,提升开发效率。
|
10月前
|
消息中间件 算法 API
三大电商API应用对比:淘宝京东拼多多谁能笑到最后?
对比主流电商平台API:淘宝架构稳定、安全性高,适合全链路整合;京东物流性能领先,适合高效物流场景;拼多多社交裂变能力强,适配社交电商。结合分层架构、微服务与事件驱动,建议按业务需求选择。
|
4月前
|
JSON 测试技术 API
爆肝3周,开源一套通用测试Skills框架:支持Web/App/接口统一技能调用
本文介绍一款通用测试Skills框架,通过“Skill抽象+注册中心+动态调度”三层设计,实现Web/App/接口三端技能统一调用。告别重复编码与工具绑定,一套YAML用例驱动多端执行,大幅提升资产复用率与团队协作效率。
|
6月前
|
人工智能 程序员 C语言
Python 与 C++、C 语言的区别及选择指南
C 语言:语法相对复杂,变量需要显式声明数据类型,代码块用大括号表示。例如:
945 3
|
存储 缓存 算法
软考通关密钥:计算机系统核心原理全解剖——软件设计师必懂的底层逻辑
专为软考中级软件设计师打造,深入解析CPU架构、存储体系、进制转换、原码补码、浮点数、寻址方式、校验码、RISC/CISC、流水线、Cache、中断、I/O控制、总线及加密技术等核心知识点,结合真题剖析高频考点,构建计算机系统底层知识体系,提升应试与实践能力。
921 1
软考通关密钥:计算机系统核心原理全解剖——软件设计师必懂的底层逻辑
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
980 161
|
人工智能 运维 机器人
《深度剖析:人工智能与人类协作模式的未来演变》
人工智能与人类的协作正经历从辅助工具到平等伙伴、特定领域到多领域融合、静态协作到动态自适应、工作场景到全场景渗透的演变。初期,AI作为高效助手处理重复任务;中期成为得力伙伴,参与医疗、科研等领域的深度协作;未来将作为平等团队成员,在智慧城市、智能家居等多领域实现跨模态协作,动态调整任务分配,全面融入生活和工作,创造更多可能性。
1318 15

热门文章

最新文章