系列九、事务

一、事务

1.1、概述

        事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,即:这些操作要么同时成功,要么同时失败。 例如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加 1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。

1.2、为什么需要事务

转账(理想情况):

转账这个操作, 需要按照以下三个步骤来完成:

     (1)查询张三账户余额;

     (2) 张三减少 1000;

     (3) 李四 增加1000;

转账(异常情况):

        异常情况, 也是分为以下这么三步来完成 , 在执行第三步时报错了 , 这样就导致张三减少1000 块钱 , 而李四的金额没变 , 这样就造成了数据的不一致 , 就出现问题了,如下:

解决:

        为了解决上述的问题,就需要通过数据库的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态,这样就保证了张三和李四账户的钱是正确的了,不会出现一个账户的钱减少了,而另外一个账户的钱却没有增加的情形。

注意事项:

        默认MySQL的事务是自动提交的,也就是说,当执行完一条 DML 语句时, MySQL 会立即隐式的提交事务。

1.3、四大特性

原子性( Atomicity ):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性( Consistency ):事务完成时,必须使所有的数据都保持一致状态。
隔离性( Isolation ):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性( Durability ):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
上述就是事务的四大特性,简称 ACID 。

1.4、案例演示

1.4.1、数据初始化

use vhr;

drop table if exists account; 
create table account(
    id int primary key AUTO_INCREMENT comment 'ID',
    name varchar(10) comment '姓名',
    money double(10,2) comment '余额'
) comment '账户表';
 
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

1.4.2、事务相关命令

(1)查看默认的事务提交方式(默认为1,表示自动提交)
select @@autocommit; 

(2)修改为手动提交
set @@autocommit = 0;

(3)开启事务

start transcation 或者 begin;

(4)提交事务

commit;

(5)回滚事务

rollback;

1.4.3、未控制事务案例

正常情况:

异常情况:

1.4.4、控制了事务案例

注意事项:先把张三、李四的账户金额恢复为2000元;

(1)正常执行,提交事务

(2)异常执行,回滚事务

1.5、事务并发

1.5.1、概述

        生产环境中的数据操作千变万化,尤其是对于双11、双12这种大型的,全名参与的场景,事务并发操作更是数不胜数!这就为事务的并发问题埋下了伏笔,总的来说,MySQL中的事务并发会产生3类问题,即:脏读、不可重复读、虚读(幻读)

1.5.2、脏读

        一个事务读到了另外一个事务还没有提交的数据。

1.5.2、不可重复读

        一个事务先后读取同一条记录,但两次读取数据的结果不同,称之为不可重复读。

 

1.5.3、虚读(幻读) 

        一个事务按照相同的条件查询数据,第一次查询时没有查询到,另一个事务执行完insert后,再次查询又查询到了,好像出现了幻影,称之为"虚读(幻读)"。

 

1.6、事务隔离级别

1.6.1、概述

        为了解决并发事务所引发的各种问题,在数据库中引入了事务隔离级别的功能,主要分为如下几种:

注意事项:事务隔离级别越高,数据越安全,但是性能越低!

1.6.2、事务隔离级别相关指令

(1)查看MySQL默认的事务隔离级别

select @@transaction_isolation;

(2)设置事务的隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言短路操作

C语言短路操作 目录 一. 概述二. 例题 一. 概述 C语言中常用的短路操作符有两个,即逻辑与(&&)和逻辑或(||)。   对于逻辑与(&&)操作符&…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式(Active Mode)1.5 Active Mode 抓包分析1.6 被动模式(Passive Mode)1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…

Golang清晰代码指南

发挥易读和易维护软件的好处 - 第一部分 嗨,开发者们,清晰的代码是指编写易于阅读、理解和维护的软件代码。它是遵循一组原则和实践,优先考虑清晰性、简单性和一致性的代码。清晰的代码旨在使代码库更易管理,减少引入错误的可能性…

python读取excel数据 附实战代码

在Python中,可以使用pandas库来读取Excel文件中的数据。下面是一个简单的例子: import pandas as pd# 读取Excel文件 df pd.read_excel(example.xlsx)# 显示前5行数据 print(df.head())在上面的代码中,我们首先导入了pandas库,并…

C/C++常见面试知识总结(三)

C语言是一种通用计算机(高级)编程语言;面向过程;广泛应用于计算机系统设计以及应用程序编写;设计目标,是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行…

springcloud微服务篇--5.Nacos注册中心

目录 一、认识Nacos 二、集成nacos 1.1添加依赖 1.2 注释掉order-service和user-service中原有的eureka依赖。(避免冲突) 1.3 注释eureka之后,添加nacos的客户端依赖: 三、服务注册到nacos 1、修改配置文件 2、启动并测试 四…

【网络安全】网络防护之旅 - Java安全机制探秘与数字证书引爆网络防线

🌈个人主页:Sarapines Programmer🔥 系列专栏:《网络安全之道 | 数字征程》⏰墨香寄清辞:千里传信如电光,密码奥妙似仙方。 挑战黑暗剑拔弩张,网络战场誓守长。 目录 😈1. 初识网络安…

RTOS中任务的创建与删除

我们在stm32f103c8t6单片机上验证RTOS中任务的创建与删除,利用stm32cube进行RTOS的配置。在选择TIM2当做RTOS的时钟,裸机的时钟源默认是 SysTick,但是开启 FreeRTOS 后,FreeRTOS会占用 SysTick (用来生成1ms 定时&…

camera曝光时间

曝光和传感器读数 相机上的图像采集过程由两个不同的部分组成。第一部分是曝光。曝光完成后,第二步就是从传感器的寄存器中读取数据并传输(readout)。 曝光:曝光是图像传感器进行感光的一个过程,相机曝光时间&#xf…

JWT令牌的作用和生成

JWT令牌(JSON Web Token)是一种用于身份验证和授权的安全令牌。它由三部分组成:头部、载荷和签名。 JWT令牌的作用如下: 身份验证:JWT令牌可以验证用户身份。当用户登录后,服务器会生成一个JWT令牌并返回…

Python实验项目9 :网络爬虫与自动化

实验 1:爬取网页中的数据。 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…

当心字符串连接的性能

在Java中,字符串连接的性能问题同样需要注意,尤其是在循环中进行大量连接操作时。Java中的字符串是不可变的,因此每次连接字符串都会产生一个新的字符串对象,可能导致性能下降。以下是一些示例,演示了不同方法的字符串…

YOLOv5改进 | SPPF篇 | FocalModulation替换SPPF(精度更高的空间金字塔池化)

一、本文介绍 本文给大家带来的改进是用FocalModulation技术来替换了原有的SPPF(快速空间金字塔池化)模块。FocalModulation是今年新提出的特征增强方法,它利用注意力机制来聚焦于图像中的关键区域,从而提高模型对这些区域的识别…

什么是缓存击穿、缓存穿透、缓存雪崩?

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

在计算机专业中,应该把学习的重点放在哪里?

在计算机专业中,应该把学习的重点放在哪里?这是许多计算机专业学生常常面临的关键问题。随着计算机科技的快速发展,学生们往往陷入了各种各样的选择和困惑中。是将时间投入到深奥的数学领域,还是专注于编程技能的磨练?…

0x17 二叉堆

0x17 二叉堆 二叉堆是一种支持插入、删除、查询最值的数据结构。它其实是一种满足“堆性质”的完全二叉树,树上的每一个节点带有一个权值。若树中的任意一个节点的权值都小于等于其父节点的权值,则称该二叉树满足“大根堆性质”,称其为“大根…

微信小程序:布局样式

效果 wxml <view class"layout"><view class"left"><view>1</view><view>1</view><view>1</view><view>1</view><view>1</view></view><view class"right"&…

2023 亚马逊云科技 re:Invent 大会探秘:Aurora 无限数据库的突破性应用

文章目录 一、前言二、Amazon Aurora 无限数据库2.1 亚马逊云科技数据库产品发展历程2.2 什么是 Amazon Aurora Limitless Database&#xff08;无限数据库&#xff09;2.3 Amazon Aurora Limitless Database 设计架构2.4 Amazon Aurora Limitless Database 分片功能2.5 使用 A…

c语言:判断是否为整数|练习题

一、题目 输入一个数字&#xff0c;判断该数字是否为整数 如图&#xff1a; 二、思路分析 1、没有小数部分的数字&#xff0c;即为整数。所以&#xff0c;只要知道该数字是否有小数部分&#xff0c;即可。 2、例子&#xff1a;1.5减去10.5&#xff0c;由于有小数部分&#xff0…

跟着官网学 Vue - 插槽

Vue 插槽是一种强大的组件通信方式。 插槽内容与出口 在 Vue 中&#xff0c;插槽是一种让父组件向子组件传递内容的方式。子组件使用 <slot> 元素作为插槽出口&#xff0c;父组件可以通过插槽内容填充这些空白区域。 示例&#xff1a; <!-- MyButton.vue --> &…