【MySQL学习笔记009】事务

一、事务简介

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

二、事务操作

1、操作1

        查看/设置事务提交方式

                select @@autocommit; 输出为1 --自动提交,0--手动提交

                set @@autocommit=0;

        提交事务

                commit;

        回滚事务

                rollback;

2、操作2

        开启事务

                start transaction 或 begin;

        提交事务

                commit;

        回滚事务

                rollback;

三、事务四大特性

        原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败;

        一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

        隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

        持久性(Durability):事务一旦提交或回滚,它对数据库中的数据改变就是永久的。

四、并发事务问题

五、事务隔离等级

        -- 查看事务隔离级别

                select @@transaction_isolation;

        -- 设置事务隔离级别

                set [session | global ] transaction isolation level [ read uncommitted | read committed | repeatavle read | serializable ]

        注意:事务的隔离级别越高,性能越低。

六、案例

        打开两个命令符窗口

        登录数据库 mysql -u root -p,切换到练习数据库use pra;

        开启事务 start transaction

        先查询一下表中数据 select * from account;

        在第一个命令符窗口中设置事务隔离级别为read uncommitted——>set session transaction isolation level read uncommitted;

        然后在第二个命令符窗口中输入命令:update account set money = money - 1000 where name = '张三'; 因为目前是开启的事务模式,所以不提交数据库是不会进行相关操作;但是在第一个命令符窗口中执行:select * from account; 会发现account表中的数据已经被修改,这就是脏读现象。

        若在第一个命令符窗口中执行set session transaction isolation level read committed;即设置事务隔离级别为read committed,重复以上操作,则不会出现脏读现象。

        设置read committed,解决脏读问题后,但是不能解决不可重复读现象。开启事务 start transaction(两个窗口),第一个窗口执行 select * from account; 然后第二窗口执行 update account set money = money + 1000 where name = '张三';,但是不执行提交,然后在第一个窗口再次执行 select * from account;发现两次查询结果一样,然后第二个窗口执行提交,第一个窗口执行查询,结果发现变化,这就是不可重复读。

        将事务隔离级别设置为repeatable read,重复上述操作,可实现重复读取。

        然而,repeatable read 隔离级别,无法解决幻读现象,开启事务 start transaction(两个窗口),第一个窗口执行select * from account where id = 3;返回空值,然后在第二个窗口执行 insert into account (id, name, money) values (3, '王五', 2000);,提交。再用第一个窗口查询,同样返回空值,然后再用第一个窗口执行插入命令 insert into account (id, name, money) values (3, '大刀王五', 2000); 返回error报错account中主键3重复,那么再次查询主键为3的数据,返回依然没有值。这种现象就是幻读。

        幻读现象可以使用serializable(串行化)隔离级别解决。

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

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

相关文章

科技云报道:开源才是大模型的未来?

科技云报道原创。 一年前,ChatGPT横空出世;7个多月后,Meta宣布开源LLaMA 2,并且可免费商用。 这一天,也成为大模型发展的分水岭。短时间内,LLaMA 2对一些闭源的大模型厂商造成了致命性的打击。 随后&…

立创EDA与设计技巧

绘制PCB流程: 绘制原理图 ——> PCB布线 ——> 铺铜 器件: 器件就是一个个不同的元件,每个元件不同的引脚有不同的功能,但有可能封装是一样的,所以将器件和封装练习起来,才能将原理图和PCB联系…

DM工作笔记-在windows下对DM7进行库还原恢复

提供了这些备份数据 在windows平台上,将这些备份数据还原到新库中。 首先实例得先停掉: 使用的软件console.exe: 重要步骤:①获取备份;②还原;③恢复 记住DMAP方式这个不要勾选,然后再获取备份…

【Java】SpringBoot快速整合Kafka

目录 1.什么是Kafka? 主要特点和概念: 主要组成部分: 2.Kafka可以用来做什么? 3.SpringBoot整合Kafka步骤: 1. 添加依赖: 2. 配置 Kafka: 3. 创建 Kafka 生产者: 4. 创建 Kafka 消费者: 5. 发布消息: 6. 使…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

MSSQL执行查询报错“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。”

文章目录 MSSQL执行查询报错“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。”报错截图根本原因 MSSQL执行查询报错“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。” 报错截…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件,所有功能均可使用。可以直接下载 下方是演示照片

【Midjourney】登录和使用:详细指南!

关于Midjourney 链接: Midjourney Midjourney 是一项使用人工智能自动生成图像的服务。你可以通过向人工智能发出称为“提示”的指令来生成你想要的图像。例如,可以生成风景、人物、建筑等各种图像,还可以调整图像风格(绘画、插画风格、摄影风…

【汇编先导】-- 2

汇编先导 6. 寄存器 存储数据:CPU > 内存 > 硬盘(固态、机械) CPU还可分为: 32位CPU 8 16 32 64位CPU 8 16 32 64(增加了寻址能力) 通用寄存器 # 32位的通用寄存器只有8个 # 可以在任意软件的底层看到 # 通用寄存器可以存储任何值存值的范围…

逻辑运算加法器

前言 逻辑门本质上操作的是单个二进制数,通过高低电压或者有无信号来表示,并且,因为二进制数的原因,一个数字,我们可以通过二进制数来表示,整数可以精确表示,浮点数可以近似表示 本篇文章使用逻…

二叉树题目:分裂二叉树的最大乘积

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:分裂二叉树的最大乘积 出处:1339. 分裂二叉树的最大乘积 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root&…

CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程

0.背景 编写此文是因为在 Linux 上跑项目时报错: sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or highe(此时已经安装了 python3)。sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(&q…