MySQL系列—13.事务

1、事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务控制语法

- 事务开始
begin;
- 事务提交,提交后就会写入物理磁盘中去
commit;
- 事务回滚,事务提交后,无法回滚
rollback;

事务的四大特性(ACID)

原子性(atomicity) 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用

一致性(consistency) 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;

隔离性(isolation) 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

持久性(durability) 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

事务自动提交

SET autocommit = 0|1|ON|OFF;

2、并发事务带来的问题

脏读(Dirty Read): 一个事务正在对数据进行修改,在这个事务提交或回滚之前,这些修改对其他事务是可见的。

解决方法: 设置事务隔离级别为READ COMMITTED。

不可重复读(Non-Repeatable Read): 同一个事务在两次查询期间,由于其他事务的修改或删除,导致查询结果不一致。

解决方法: 设置事务隔离级别为REPEATABLE READ。

幻读(Phantom Read): 同一个事务在两次查询期间,由于其他事务的插入操作,导致查询结果集中出现之前不存在的行。

解决方法: 设置事务隔离级别为SERIALIZABLE。

3、数据库的隔离级别

查看隔离级别

- 查看隔离级别,8.0版本之前的,用SELECT @@tx_isolation
select @@transaction_isolation;- 修改隔离级别
set session transaction isolation level  READ UNCOMMITTED;

读未提交(READ-UNCOMMITTED):

  • 事务可以读取其他事务未提交的数据,这被称为脏读(Dirty Read)。

  • 最低的隔离级别,提供了最少的并发控制。

设置隔离级别为读未提交

- 设置隔离级别
set session transaction isolation level    read uncommitted;- 查看隔离级别
select  @@transaction_isolation;

读已提交(read committed oracle默认的隔离级别)

  • 事务只能读取其他事务已经提交的数据,避免了脏读。

  • 但是,在同一个事务中,多次读取同一数据可能会得到不同的结果,这被称为不可重复读(Non-Repeatable Read)。

例:事务 A 读取了数据,然后事务 B 修改了该数据并提交。事务 A 再次读取该数据时,得到了不同的结果,这就是不可重复读。

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name; -- 第一次读取
-- 其他操作
SELECT * FROM table_name; -- 第二次读取,可能得到不同的结果
COMMIT;

-- 事务 B
START TRANSACTION;
UPDATE table_name SET column_name = value WHERE condition;
COMMIT;

设置隔离级别为读已提交

- 设置隔离级别
set session transaction isolation level    read committed;- 查看隔离级别
select  @@transaction_isolation;

可重复读(repeatable read mysql 的默认隔离级别)

  • 在同一个事务中,多次读取同一数据时,结果是一致的,避免了不可重复读。

  • 但是,可能会出现幻读(Phantom Read)。幻读是指在一个事务中,两次查询返回的行数不同,这是因为其他事务插入或删除了数据。

  • mysql> select @@transaction_isolation;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | READ-UNCOMMITTED        |
    +-------------------------+

例:事务 A 读取了一些数据,然后事务 B 插入了一些新的数据。事务 A 再次查询时,发现多了一些数据,这就是幻读。

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name WHERE condition; -- 第一次查询
-- 其他操作
SELECT * FROM table_name WHERE condition; -- 第二次查询,可能出现幻读
COMMIT;

-- 事务 B
START TRANSACTION;
INSERT INTO table_name VALUES (...);
COMMIT;

串行化(Serializable)

  • 最高的隔离级别,提供了最强的并发控制。

  • 事务之间是完全隔离的,一个事务必须等待另一个事务完成后才能执行。

  • 避免了脏读、不可重复读和幻读。

例:事务 A 和事务 B 同时尝试对同一数据进行操作,事务 B 必须等待事务 A 完成后才能执行

-- 事务 A
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE; -- 锁定数据
-- 其他操作
COMMIT;

-- 事务 B
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE; -- 等待事务 A 完成
-- 其他操作
COMMIT;

4、如何选择隔离级别

    并发程度:如果系统需要高并发,那么可以选择较低的隔离级别,以提高并发性能。但是,这可能会导致数据的不一致性。

    数据一致性要求:如果系统对数据一致性要求很高,那么应该选择较高的隔离级别,以确保数据的正确性。

    性能要求:较高的隔离级别通常会导致性能下降,因为需要更多的锁和同步机制。

        在实际应用中,可以根据具体情况选择合适的隔离级别。一般来说,读已提交是比较常用的隔离级别,它可以避免脏读,同时提供了较好的并发性能。如果对数据一致性要求非常高,可以选择可重复读或串行化。

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

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

相关文章

基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60&am…

六西格玛咨询:石油机械制造企业的成本控制与优化专家

一、石油机械制造行业现状及主要困扰 随着全球能源需求的日益增长,石油开采和生产设备需求不断增加,石油机械制造行业在过去数十年里得到了迅猛发展。然而,石油机械制造作为一个高度复杂且技术密集的行业,也面临着多重挑战。首先…

【Vue】- 路由及传参

文章目录 知识回顾前言源码分析1. 声明式导航2. 路由传参3. 可选符4. 重定向5. 4046. 跳转及传参7. 路由懒加载拓展知识总结router-link静态传参和动态路由的对比知识回顾 前言 什么是单页面应用程序? ● 所有功能在一个html页面上实现 单页面应用优缺点? ● 优点:按需更新…

大模型时代的 AI 产品经理何去何从?

每天 LLM 相关的资讯都让人过载。作为 AI 产品经理,你是更兴奋呢,还是更担忧呢?整理了一下个人近期的思考,欢迎感兴趣的朋友一起交流。不管答案如何,相信我们都不应置身事外。 1 关于大模型‍‍ 大模型的各种原理讲…

OpenAI O1热度己过-如此快速的冷场带来的是人们更多对现今“AI”的思考

引入o1的瞬间辉煌 o1如耀眼的新星,闪耀于科技天空。发布时,因其思考能力而备受瞩目。它能在回答问题之前进行更多的思考,尤其擅长复杂推理。这种能力引发了众多用户的好奇与热情。诸如“9.8和9.11哪个大?”的简单问题被广泛地验证…

上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频

上海人工智能实验室日前推出的Vchitect2.0视频生成模型正在悄然改变视频创作的游戏规则。这款尖端AI工具不仅简化了视频制作流程,还为创作者提供了前所未有的灵活性和高质量输出。 Vchitect2.0的核心优势在于其强大的生成能力和高度的可定制性。用户只需输入文字描…

Java获取随机数

在Java中获取随机数通常会使用java.util.Random类或者Math.random()方法 1.java.util.Random java.util.Random类用于生成伪随机数。 // 使用无参构造方法创建Random对象Random rand new Random();// 生成一个[0, 100)范围内的随机整数int randomInt rand.nextInt(100);Sys…

算法练习题26——多项式输出(模拟)

输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数。 第二行有 n1 个整数,其中第 i 个整数表示第 n−i1 次项的系数,每两个整数之间用空格隔开。 输出格式 输出共 1 行,按题目所述格式输出多项式。…

【ARM】中断的处理

ARM的异常向量表 如果发生异常后并没有exception level切换,并且发生异常之 前使用的栈指针是SP_EL0,那么使用第一组异常向量表。如果发生异常后并没有exception level切换,并且发生异常之 前使用的栈指针是SP_EL1/2/3,那么使用第…

雷朋太阳镜和AEG的制胜法宝是:音乐节以及数据驱动的品牌推广

图片来源:Photo by Ethan Robertson on Unsplash 几十年来,我们见证了流行文化偶像对大众的影响。雷朋一直是一个深受偶像和大众喜爱的品牌。借助这股浪潮,雷朋与全球最大的娱乐公司之一AEG合作,吸引消费者,并以沉浸式…

JAVA-集合相关

HashMap如何解决哈希冲突的? 计算hash值,基于hashCode计算冲突之后,先是使用链式寻址法当链表长度大于8,且hash表的容量大于60的时候,再添加元素则转化成红黑树 为什么计算hash值是,是将hash地址的值右移1…

推荐10款最佳的电脑监控软件,知名电脑监控软件推荐

随着互联网和科技的飞速发展,电脑监控软件成为企业和个人用户管理和保护信息安全的必备工具。这些软件可以帮助你实时了解电脑的使用情况、保护隐私、优化工作效率,甚至防止潜在的安全威胁。在这篇文章中,我们将为你推荐10款最佳的电脑监控软…

k8s的搭建

一、安装环境 准备三台主机: 192.168.1.66 k8s-master 192.168.1.77 k8s-node01 192.168.1.88 k8s-node02 网段: Pod ⽹段 172.16.0.0/16 Service ⽹段 10.96.0.0/16 注:宿主机⽹段、Pod…

乱弹篇(52)旁观者说

众所周知,地球人都晓得“股市是经济的晴雨表”这个定律,那么中秋节后的中国内地股市,为何在节后的9月18日首个交易日,上证指数仍继续下行,盘中还一度跌破2700点创7个多月以来新低,整体市场数千个股下跌呢&a…

c#进度条实现方法

在使用c#做WinFrom开发时,经常会用到进度条(ProgressBar)。那么如何才能实现winfrom进度条及进度信息提示呢? 方法一:多线程 使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采…

CH1-2 误差分析

一、误差的概念 用计算机进行实际问题的数值计算时,往往求得的是问题的近似解,都存在误差。 模型误差:在建立数学模型过程中,要将复杂的现象抽象归结为数学模型,往往要忽略一些次要因素的影响,而对问题作一些简化&am…

Nginx越界读取缓存漏洞(CVE-2017-7529)

漏洞原理: 影响版本内默认配置模块的Nginx只需要开启缓存,攻击者可以通过发送包含恶意构造range域的header请求进行远程攻击造成信息泄露。 影响范围: Nginx 0.5.6 – 1.13.2 漏洞复现: 开启靶场,访问8080端口 中间…

数据处理与统计分析篇-day05-Pandas详解

创建DaraFrame对象 概述 DataFrame是一个表格型的结构化数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。 DataFrame是Pandas中的最基本的数据结构对象&…

如何使用下拉字段创建WordPress表单(简单方法)

许多网站所有者在收集用户输入时,都会因为表单过长而让用户感到压迫。 下拉列表字段通过提供一个简洁的选项列表,使表单变得更简单。这意味着它们可以提高表单完成率,并改善用户体验。 在本文中,我们将向您展示如何创建带有下拉…

Vue安装及环境配置【图解版】

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words! 目录 一.node.js的安装…