SQL-事务与并发问题

news2024/11/15 14:01:43

        在数据库管理系统中,事务是一个重要的概念,它确保了一组数据库操作要么全部成功,要么全部失败,从而维护数据的完整性和一致性。随着多个用户同时访问数据库,事务的并发处理变得尤为重要。

1. 事务的定义

事务是指一组数据库操作,这些操作被视为一个单一的逻辑单元。事务的主要目标是确保数据在并发环境下的完整性和一致性。事务的四大特性被称为ACID特性:

  • 原子性 (Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何操作失败,整个事务将被回滚。
  • 一致性 (Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。即使在发生错误或系统崩溃的情况下,数据库也必须保持一致性。
  • 隔离性 (Isolation):多个并发事务的执行互不干扰,每个事务的执行结果在提交之前对其他事务是不可见的。
  • 持久性 (Durability):一旦事务被提交,其结果是永久性的,即使系统崩溃也不会丢失。

2. 数据准备

        接下来,我们将通过一个简单的转账示例来演示事务的使用。首先,我们创建一个客户表并插入一些初始数据。

create table account (
    id int auto_increment primary key comment '主键id',
    name varchar(10) comment '姓名',
    money int comment '余额'
) comment '客户表';

insert into account (id, name, money) values 
(null, '张三', 2000),
(null, '李四', 2000);

3. 转账操作示例

        在这个示例中,我们将实现张三向李四转账1000元的操作。我们将使用事务来确保转账的原子性。

3.1 查看自动提交状态

在进行事务操作之前,我们可以查看当前的自动提交状态:

select @@autocommit;  -- 查看当前事务自动提交状态,默认为1

3.2 开始事务

我们将手动控制事务的开始和结束:

start transaction;  -- 开始事务

3.3 执行转账操作

1.查询张三的余额:

select money from account where name = '张三';  -- 查询张三的余额

2.扣款操作:

update account set money = money - 1000 where name = '张三' and money >= 1000;  -- 扣款1000

 3.增加李四余额:

update account set money = money + 1000 where name = '李四';  -- 李四余额增加1000

3.4 提交或回滚事务

最后,我们需要提交事务以保存更改,或者在出现错误时回滚事务:

commit;  -- 提交事务
-- rollback;  -- 如果发生错误,回滚事务

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

1.脏读是指一个事务可以读取另一个事务未提交的修改。这可能导致读取到不一致的数据。

比如事务B读取了事务A尚未提交的数据

2.不可重复读是指在同一个事务中,多次读取同一数据的结果可能不同。这通常发生在一个事务读取数据后,另一个事务对该数据进行了修改。

比如事务A两次读取结果不一致,因为事务B对同一id提交了数据

3.幻读是指在一个事务中,读取到的结果集在同一事务内的后续查询中发生变化。这通常发生在一个事务读取了一组数据,而另一个事务插入了新数据。

比如事务A查询时没有数据,插入数据时却发现已经有数据存在了,导致插入数据失败

 

 5. 事务的隔离级别

        在并发环境中,多个事务可能会同时访问相同的数据,导致数据不一致的问题。SQL提供了四种事务隔离级别来控制这种并发访问的行为:

  • 读未提交 (Read Uncommitted):一个事务可以读取另一个事务未提交的修改。这可能导致“脏读”现象。
  • 读提交 (Read Committed):一个事务只能读取已提交的修改。这样可以避免脏读,但可能会导致“不可重复读”现象。
  • 可重复读 (Repeatable Read):在一个事务内,多次读取同一数据的结果是相同的。可以避免脏读和不可重复读,但可能会导致“幻读”现象。
  • 串行化 (Serializable):最高的隔离级别,所有事务串行执行,完全避免并发问题,但性能较低。

MySQL中默认是 Repeatable Read,而在 Oracle中默认是Read Committed

 

5.1 查看和设置事务隔离级别

我们可以通过以下SQL语句查看和设置当前会话的事务隔离级别:

示例:

select @@transaction_isolation;  -- 查看当前事务隔离级别

set session transaction isolation level read committed;  -- 设置当前会话的事务隔离级别为读提交
set global transaction isolation level repeatable read;  -- 设置全局事务隔离级别为可重复读

6. 并发问题示例

为了更好地理解事务的并发问题,我们可以考虑以下场景:

6.1 脏读示例

-- 事务A
start transaction;
update account set money = money - 1000 where name = '张三';

-- 事务B
start transaction;
select money from account where name = '张三';  -- 读取到未提交的值

在这个例子中,事务B在事务A提交之前读取了张三的余额,可能会导致事务B看到的余额不准确。

6.2 不可重复读示例

-- 事务A
start transaction;
select money from account where name = '张三';  -- 第一次读取

-- 事务B
start transaction;
update account set money = money - 500 where name = '张三';  -- 更新张三的余额
commit;

-- 事务A
select money from account where name = '张三';  -- 第二次读取,结果可能不同

        在这个例子中,事务A在第一次读取后,事务B对张三的余额进行了更新,导致事务A在第二次读取时看到的结果与第一次不同。

6.3 幻读示例

-- 事务A
start transaction;
select * from account where money > 1000;  -- 第一次读取

-- 事务B
start transaction;
insert into account (name, money) values ('王五', 1500);  -- 插入新记录
commit;

-- 事务A
select * from account where money > 1000;  -- 第二次读取,结果集可能不同

        在这个例子中,事务A在第一次查询时只返回了张三和李四的记录,但在事务B插入新记录后,事务A在第二次查询时可能会看到新的记录。

7. 总结

        事务是确保数据库操作一致性和完整性的关键机制。在并发环境中,事务的隔离级别能够有效控制并发访问带来的数据不一致问题。理解事务的ACID特性和不同的隔离级别将有助于开发者设计出更可靠的数据库应用。希望这篇文章能对你有所帮助。

最后点赞支持一下吧,好让我有继续创作的动力

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂推荐系统

随着互联网的飞速发展,信息过载已经成为了一个普遍的问题。我们每天都要面对大量的内容,却很难找到真正符合自己兴趣和需求的信息。这时,推荐系统应运而生,它能够根据用户的兴趣和行为,智能地推荐相关内容,…

​与辉同行2日破亿,打工就是在浪费生命,真让罗永浩说对了!​

去年东方甄选的小作文事件发生之后 罗永浩就鼓励董宇辉出来单干还发表了惊天言论,“打工就是在浪费生命” 董宇辉接手“与辉同行”公司后,两天直播总销售额就已经超过了1亿元 难道真让罗永浩说对了,打工就是在浪费生命吗? 打工…

20240819解决飞凌的OK3588-C的核心板的适配以太网卡RTL8211F-CG在百兆模式下通过交换机上外网

20240819解决飞凌的OK3588-C的核心板的适配以太网卡RTL8211F-CG在百兆模式下通过交换机上外网 2024/8/19 18:00 缘由:由于自制的飞凌的OK3588-C的核心板的底板对空间要求高/敏感,并且对网速要求不高,百兆即可满足要求。 也就直接使用千兆网卡…

质量体系 | 这些医疗器械质量管理标准/法规有什么区别?

在医疗器械行业中,确保产品质量和安全至关重要,而ISO 9001、ISO 13485、GMP、中国《医疗器械生产质量管理规范》和QS820等标准/法规为行业提供了明确的指导。 ISO9001 ISO9001:2015 Quality management systems-Requirements(质量管理体系要…

通过ros2服务来控制程序的启动和关闭

运行handle.py程序,启动服务节点,调用服务节点控制程序的启动和关闭,本例为启动和关闭一个python程序(每隔一秒打印hello,world),运行截图如下: 一、创建服务节点 handle.py import rclpy from rclpy.no…

无人机之航拍挑选注意事项

航拍无人机的挑选,主要从安全稳定、航拍画质、云台防抖、图传距离、续航时间等因素来考虑。 一、安全稳定 安全稳定性,是我们选择航拍无人机的首要参考标准。毕竟再好的镜头、再好的外形设计、再好的航拍功能,如果没有安全稳定的飞行&#x…

【若依 - 前后端不分离版】SysCaptchaController 详解:生成与处理验证码

文章目录 一、SysCaptchaController 类概述1. 类的功能2. 主要功能 二、验证码生成流程1. 接口定义2. 代码流程解析2.1. 设置响应头2.2. 生成验证码2.3. 存储验证码2.4. 返回验证码图片 三、处理异常和流关闭1. 异常处理2. 流关闭 四、实际应用中的验证码处理1. 验证码生成和展…

【数模修炼之旅】05 拟合模型 深度解析(教程+代码)

【数模修炼之旅】05 拟合模型 深度解析(教程代码) 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法,大家可以关注这个专栏,持续学习哦,对于大家的能力提高会有极大的帮助。 1 拟合模型介绍及应用 …

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案

无缝融入,即刻智能[三]:Dify-LLM平台知识库构建(多路召回、精排重排),43K+星标见证专属智能方案 大语言模型的训练数据一般基于公开的数据,且每一次训练需要消耗大量算力,这意味着模型的知识一般不会包含私有领域的知识,同时在公开知识领域存在一定的滞后性。为了解决这一…

SSM学生社团管理系统—计算机毕业设计源码20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

python3爬虫(未完结)

一个简单的例子:爬取自己的csdn博客,统计每篇博客的访问量,制作一个柱状图,以访问量从大到小的方式显示。 1. 首先从“个人主页”爬取所有所有文章的链接 1.1 打开个人主页,右键->检查:可以看到每篇文章…

如何使用Java SpringBoot+Vue搭建二手闲置交易系统?

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

四步解决国标设备接入问题

用国标协议完成多品牌设备统一接入,是智能设备在多场景应用中都会碰到的安装步骤。国标接入常常过程复杂,这边介绍一种相对简便的方法,用萤石开放平台的“国标设备添加工具”接入 Step1:私信我获取安装包 私信我获取国标设备添加…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景: 我的情况是这样,域名解析是华为云的,然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是9天),申请步骤如下 主要步骤说明 申请免费SSL证书配置证书到域…

自定义变量添加到分机呼叫信息(mod_cti基于FreeSWITCH)

文章目录 前言联系我们添加流程1. 修改cti.json配置2. 配置自动外呼进入排队转坐席3. 变量同步到坐席通道 4. 导入号码添加自定义变量 前言 在默认配置中,分机的呼叫信息会被推送到redis的hash表中,hash表名:calls。我们可以通过修改配置&am…

【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路(Qwen2-7B-Instruct+BGE Embedding)

【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路(Qwen2-7B-InstructBGE Embedding) 1. 环境准备2. 数据准备3. RAG框架构建3.1 数据读取 数据切块3.2 构建向量索引3.3 检索增强3.4 main函数 参考 基于LlamaIndex框架,以Qwe…

【GitLab】使用 Docker 安装 GitLab 1:配置 SSH 端口

使用 Docker 安装 GitLab 要求修改ssh端口 GitLab 使用 SSH 通过 SSH 与 Git 交互。默认情况下,GitLab 使用端口22。 要在使用 GitLab Docker 映像时使用其他端口,您可以执行以下操作之一: 更改服务器的 SSH 端口(推荐)。 更改 GitLab Shell SSH 端口。 更改服务器的 SSH …

电测量数据交换DLMS∕COSEM组件第62部分:COSEM接口类(4)

1.7COSEM服务器模型 COSEM服务器被构建为3层体系结构如图3所示。 图4示例说明如何用COSEM服务器模型构建一台组合式计量设备。 1.8COSEM逻辑设备 1.8.1概述 COSEM逻辑设备包含一组COSEM对象,每个物理设备均应包含一个“Management logical device”。对COSEM逻辑设备…

MPLS相关实验

一、实验拓扑图以及实验要求 1、实验拓扑图 2、实验要求 合理利用IP地址进行分配R3、R4、R5、R6运行ospf在R2、R3、R4、R5、R6上运行MPLSR1上使用静态,R7上运行rip协议,R8上运行ospf协议全网可达 二、实验分析 合理利用IP地址进行分配R3、R4、R5、R6…

将自己的网站改造成可安装的PWA

概述 本文是一篇水文,感兴趣的读者可以看看。分享一下怎么讲自己的网站改造成可安装的PWA。 PWA简介 渐进式 Web 应用(Progressive Web App,PWA)是一个使用 web 平台技术构建的应用程序,但它提供的用户体验就像一个…