MySQL基础-事务

目录

1.事务简介

2.事务的操作

2.1 实验需要用到的数据

2.2 完成转账操作

修改事务执行方式

手动开启事务的方式

 3.事务的四大特性

4.并发事务问题

5.事务隔离级别

5.1 事务隔离级别分类

5.2 查看事务隔离级别

5.3 设置事务隔离级别


1.事务简介

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。其主要作用就是为了保证数据的统一性和完整性。

最典型的案例:当处理银行账户的转账操作时,可以使用事务来确保数据的一致性和完整性。假设有两个账户,账户A和账户B,我们想要从账户A向账户B转移一定金额。这时候的增加B账户的金额和减少A账户的金额就必须要同时成功,否则就会出现意外情况。

总结:当我们需要同时执行好几个sql语句,并且必须要确保所有的sql语句都运行成功,这时候才会修改数据库中的数据,否则当初临时修改的数据会执行回滚操作将修改的数据恢复回原来的数据。

2.事务的操作

2.1 实验需要用到的数据

创建一个账户表并且插入需要用到的数据

create table account(id int auto_increment primary key ,name varchar(10),money int
) comment '账户表';insert into account (id, name, money) values (null,'zs',2000),(null,'ls',2000);

2.2 完成转账操作

转账执行流程

查询被转账的账户余额----->被转账用户余额减少------>收入用户余额增加

没有采用事务时的执行基本执行流程

# 查询用户余额
select * from account where name = 'zs';
# 将 zs 的余额减少1000
update account set money = money - 1000 where name = 'zs';
# 将 ls 的余额增加1000
update account set money = money + 1000 where name= 'ls';

执行结果

现在这个执行结果是正确的

现在假设出现了异常情况

# 查询用户余额
select * from account where name = 'zs';
# 将 zs 的余额减少1000
update account set money = money - 1000 where name = 'zs';
出现错误 #语法错误
# 将 ls 的余额增加1000
update account set money = money + 1000 where name= 'ls';

这三句sql出现了明显的语法错误,第三句sql是无法执行的,因为前面已经出现了报错

这时候执行结果就会出现钱不见的问题,此时就需要结合事务来完成这个转账功能。

修改事务执行方式

mysql语句中每一句sql语句都是一个独立的事务,且它们都是自动执行的

此时我们可以手动的关闭事务自动提交,改为手动提交

select @@autocommit; # 查询提交方式,0为手动,1为自动
set @@autocommit = 0; # 修改提交方式为手动

这时候修改了事务提交的方式,此时在执行对应的sql语句就需要手动提交才可以修改数据

可以看到在我们执行完上面的三句sql后数据并没有修改

手动提交事务

commit;

执行完这条手动提交之后,数据库的数据就发生了变化

假如事务出现了异常,就再手动回滚数据

rollback;

手动开启事务的方式

# 开启事务
start transaction ;

其实现方式和修改事务的执行方式是一致的

执行完sql后数据不会发生改变,需要手动的提交事务,或者出现异常回滚事务

执行语句也是一样

commit; # 提交事务rollback; # 回滚事务

注意这里的提交以及回滚在开启的一个事务中只有一个能执行,假如已经提交了事务,代表此事务已经结束了,就不能在执行回滚事务了,但上面的修改事务的执行方式是可以多次执行的。

 3.事务的四大特性

  1. 原子性(Atomicity):事务是原子的,意味着它要么完全执行,要么完全回滚。如果事务中的任何一部分操作失败,整个事务都将被回滚,不会留下部分更改。

  2. 一致性(Consistency):事务开始前数据库必须处于一致状态,事务结束后,数据库也必须保持一致状态。这意味着事务应该满足预定义的约束,如唯一性约束、外键关系等。

  3. 隔离性(Isolation):多个事务可以同时执行,但它们应该被隔离,以防止互相干扰。数据库系统通常提供了不同的隔离级别,例如读未提交、读已提交、可重复读和串行化,以控制事务之间的可见性和互动。

  4. 持久性(Durability):一旦事务提交,对数据库的更改应该永久保存,即使发生系统崩溃或故障。

4.并发事务问题

脏读:在某些隔离级别下,一个事务可能会读取到另一个事务尚未提交的未确认数据,这被称为脏读。如果读取的数据最终被回滚,读取的数据就会变得无效。

不可重复读:在某些隔离级别下,一个事务可能会在同一个事务中的两次读取之间看到不同的数据,这被称为不可重复读。这可能是由于其他事务的修改导致的。

 

幻读:在某些隔离级别下,一个事务可能会在同一个事务中的两次查询之间看到不同数量的行,这被称为幻读。这是由于其他事务插入或删除行导致的。

 

5.事务隔离级别

5.1 事务隔离级别分类

  1. 读未提交(Read Uncommitted):最低级别,允许一个事务读取其他事务尚未提交的数据。这可能导致脏读、不可重复读和幻读等问题

  2. 读已提交(Read Committed):这是大多数数据库系统的默认隔离级别。在这个级别下,一个事务只能读取已经提交的数据,解决了脏读。但仍然可能发生不可重复读和幻读

  3. 可重复读(Repeatable Read 默认):在这个隔离级别下,一个事务在开始时会创建一个一致性的快照,然后在整个事务期间使用这个快照。这可以防止不可重复读和脏读,但仍然可能发生幻读。MySQL的InnoDB存储引擎默认使用这个隔离级别。

  4. 串行化(Serializable):最高级别,确保了最高程度的数据一致性。在这个级别下,事务之间彻底隔离,不会发生脏读、不可重复读或幻读。但是,它通常会导致性能下降,因为它需要更多的锁定和资源。

5.2 查看事务隔离级别

select @@transaction_isolation;

当前是默认的

5.3 设置事务隔离级别

set session transaction isolation level 隔离级别;

 

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

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

相关文章

【Linux】文件权限详解

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的…

vue-6

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!! 2.解决方案 vue-router 提供了一个全局组件 router…

我的创业之路:我为什么选择 Angular 作为前端的开发框架?

我是一名后端开发人员,在上班时我的主要精力集中在搜索和推荐系统的开发和设计工作上,我比较熟悉的语言包括java、golang和python。对于前端技术中typescript、dom、webpack等流行的框架和工具也懂一些。目前,已成为一名自由职业者&#xff0…

Allegro如何用Pad Designer 设计焊盘

跟其它PCB的设计软件不一样。Allegro制作封装,第一步要先制作焊盘。 本文以圆形钻孔0.5mm,外盘0.8mm的C05D08焊盘为例一步步讲解如何制作焊盘。 1、首先打开Pad Designer,选择File→New,新建一个焊盘。 然后跳出下面的对话框,在框内输入封装名称,选择好要保存的焊盘路径…

母婴店怎么在微信小程序卖东西

随着互联网的发展,微信小程序已经成为一种新型的电商模式,它无需下载安装,使用方便,不占用手机内存,让购物变得更加简单便捷。母婴店也可以通过微信小程序来销售产品,拓宽销售渠道,增加销售额。…

HDMI简介

VGA接口 VGA传输红绿蓝模拟信号和同步信号。因传输的模拟信号,易受干扰,因此,在高分辨率下字体容易虚,信号线长的话,图像有拖尾现象。目前一些显示器已经不带VGA接口,取而代之的是HDMI和DP接口。 如下图所示…

Vs - Qt - 下拉窗口示例

下列代码定义了一个窗口&#xff0c;窗口采用竖直布局&#xff1a;一个按钮及一个label。按下按钮时候&#xff0c;窗口扩张&#xff0c;显示label控件。再次按下按钮时&#xff0c;窗口收缩&#xff0c;隐藏label控件。 详细代码如下&#xff1a; #include <QApplication&g…

微信小程序 table表格 固定表头和首列 右侧表格可以左右滚动

(一) 1.左侧一列固定不动 2.右侧表格内容可以左右滚动 3.单元格内容平均分配 4.每一行行高可以由内容撑开 通过 js 设置左侧一列行高与右侧表格内容行高保持一致 1.1 效果图 1.2 tabble.wxml <view classtable><!-- 左侧固定 --><view classtable_left_colum…

深入了解 RabbitMQ:高性能消息中间件

一、什么是消息队列 消息队列(Message Queue)是在消息的传输过程中保存消息的容器、 消息指的是两个应用间传递的数据。数据的类型有很多种形式 二、应用场景 主要有三个作用异步处理 场景说明: 用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法串行的应用解耦 场…

【juc】future并行执行并获取返回值

目录 一、截图示例二、代码示例2.1 接口示例2.2 调用示例 一、截图示例 二、代码示例 2.1 接口示例 package com.learning.controller;import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.…

stm32之freeRTOS驱动小车

该文章记录将stm32之智能小车总结移植到freeRTOS上&#xff0c;期间也遇到了好些问题&#xff0c;这里做下记录。也是对freeRTOS的一个应用实践。 一、freeRTOS工程的创建 工程是利用CubeMX进行创建的&#xff0c;挺简单的&#xff0c;有空再试下手动移植freeRTOS。 启用软件定…

LLMs 生成式人工智能项目生命周期备忘单Generative AI Project Lifecycle Cheat Sheet

到目前为止&#xff0c;在本课程中&#xff0c;从选择模型到微调模型&#xff0c;再到将其与人类偏好对齐&#xff0c;这一切都将在您部署应用程序之前发生。为了帮助您规划生成式AI项目生命周期的各个阶段&#xff0c;这个速查表提供了每个工作阶段所需的时间和精力的一些指示…