当前位置: 首页 > news >正文

mysql事务使用和事务隔离级别与sqlserver的比较

在 MySQL 中,事务 (Transaction) 是一个将一组 SQL 语句作为一个整体执行的机制。事务确保要么所有操作都执行成功,要么在遇到错误时回滚到之前的状态,从而保证数据库数据的一致性和完整性。

事务的四大特性(ACID)

事务具有以下四个关键特性,简称为 ACID:

  1. 原子性 (Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务中的某一部分失败,整个事务会回滚,数据将恢复到事务开始之前的状态。

  2. 一致性 (Consistency):事务的执行结果必须使数据库从一个一致状态变为另一个一致状态。事务在完成后,所有的数据都必须符合数据库的完整性约束,列如(不管是用户正常执行提交了,还是执行过程中发生异常回滚了,最终操作的数据都要实现平衡,不能多也不能少,就像化学中的遵循质量守恒定律)。

  3. 隔离性 (Isolation):一个事务所做的操作对其他事务是不可见的,直到该事务提交。这确保了多个事务并发执行时不相互影响,就行docker一样在自己容器中跑着自己的项目,不会影响到其他容器。

  4. 持久性 (Durability):一旦事务提交,其对数据库的更改是永久的,即使系统崩溃也不会丢失。

基本使用

下面是个基本案例,简单概括事务的使用,不深入。

先创建两个表,一个users用户表,一个accounts账户表.

用户表有用户id,用户名username,账户idaccountId,账户id对应账户表的id。


CREATE TABLE `users`  (`id` int NOT NULL,`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`accountsId` int NOT NULL
) ;INSERT INTO `users` VALUES (1, 'zhangsan', 2);

账户表,有account_id账户id,balance余额字段

CREATE TABLE `accounts`  (`account_id` int NOT NULL,`balance` decimal(10, 2) NULL DEFAULT NULL,PRIMARY KEY (`account_id`) USING BTREE
) ;-- ----------------------------
-- Records of accounts
-- ----------------------------
INSERT INTO `accounts` VALUES (1, 800.00);
INSERT INTO `accounts` VALUES (2, 500.00);
INSERT INTO `accounts` VALUES (3, 4500.00);

MySQL 中的事务控制语句
1.开启事务:
start TRANSACTION;

或者 

BEGIN;

  中间业务部分,在开启事务BEGIN;和提交事务之间COMMIT; 写你要执行的sql业务。

在 MySQL 中,事务可以操作的 SQL 语句主要涉及修改数据的 DML(数据操作语言) 语句,这些语句包括 INSERTUPDATEDELETE,它们会对数据库中的数据进行修改,所以要涉及的业务只能是插入、更新、删除这三种对mysql的操作才能使用事务,事务无法执行,包括 CREATEDROPALTER 等语句,用于定义数据库的结构。

2. 提交事务:

直到事务提交时执行的sql更改才会永久生效。如果sql报错事务回滚,所有更新将被撤销。

COMMIT;
 3.回滚事务:

终止当前事务并撤销事务中所有未提交的更改,使数据库恢复到事务开始之前的状态。

ROLLBACK; 

上面的开启事务和提交事务、回滚事务 ,基本上就是事务的核心,使用这三个操作就可以让事务跑起来。

基本实例:

一个简单的业务当usersid删除,账户id也删除

-- 一个简单的业务当usersid删除,账户id也删除
-- --开启事务 使用start TRANSACTION 和BEGIN;都可以-- start TRANSACTION;
BEGIN;
delete FROM users u WHERE  accountsId=2;
DELETE FROM accounts WHERE account_id = 2;-- 如果一切正常,提交事务
COMMIT;-- 如果有问题,回滚所有更改
ROLLBACK;-- 恢复数据,上面事务sql全部一起执行,保持事务一致性和原子性
INSERT INTO accounts (account_id, balance) VALUES (2, 500);
INSERT INTO users(id,username,accountsId) VALUES(1,'zhangsan',2);

运行事务代码,从开启事务begin;到ROLLBACK;要全部一起执行;那么执行成功可以去看,两个表的对应account_id=2的数据都已经删除了,其中一个失败都回滚;

事务进阶:
4.使用保存点

如果在一个事务中需要部分回滚,可以使用保存点 (SAVEPOINT)。

简单示例:写一个简单的业务,第一个表插入数据后,往另外一个表插入数据

 如果在一个事务中需要部分回滚,可以使用保存点 (SAVEPOINT)。

-- 恢复数据
INSERT INTO accounts (account_id, balance) VALUES (2, 500);
INSERT INTO users(id,username,accountsId) VALUES(1,'zhangsan',2);-- 设置存储保存点,的事务用法
-- --写一个简单的业务,第一个表插入数据后,往另外一个表插入数据
BEGIN;-- 插入 users 表中的记录一条记录INSERT INTO users(id,username,accountsId) VALUES(2,'wangwu',4);-- 在第一个 插入users表 成功后设置保存点SAVEPOINT my_first_savepoint;-- 再给 accounts 表插入一条对应users表中对应的数据的记录INSERT INTO accounts (account_id, balance) VALUES (4, '100.00');--  如果报错 就回滚到保存点
ROLLBACK TO SAVEPOINT my_first_savepoint;-- 如果一切正常,提交事务COMMIT;
5.事务隔离级别

为什么要使用事务隔离级别?为什么要用锁?

并发事务问题:

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

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

幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时候,又发现这行数据已经存在了,好像出现了“幻影”。

所以需要设置隔离级别,控制事务之间的相互影响。

对应的隔离级别,对应处理相对应的并发事务问题!

下面这个图打钩的是可能出现的问题。

MySQL 支持不同的事务隔离级别,以控制事务之间的相互影响。常见的隔离级别有四种:

  1. READ UNCOMMITTED(Read uncommitted)(未提交读)

    • 事务可以读取到其他未提交事务的更改,存在脏读问题。
  2. READ COMMITTED(Read committed)(提交读)

    • 事务只能读取到已经提交的更改,避免了脏读,但可能存在不可重复读。
  3. REPEATABLE READ(Repeatable Read(mysql默认隔离级别))(可重复读)

    • 在同一事务内,事务每次读取的结果都是相同的,避免了脏读和不可重复读,但可能存在幻读问题。
  4. SERIALIZABLE(可串行化)

    • 最严格的隔离级别,所有事务串行执行,避免了脏读、不可重复读和幻读,但性能较差。

 事务设置隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL [级别];
-- 设置事务隔离级别为 REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 开始事务
BEGIN;-- 插入 users 表中的记录
INSERT INTO users(id, username, accountsId) VALUES(2, 'wangwu', 4);-- 插入成功后,设置保存点
SAVEPOINT my_first_savepoint;-- 尝试向 accounts 表插入一条记录
INSERT INTO accounts (account_id, balance) VALUES (4, '100.00');-- 如果插入 accounts 表时发生错误,回滚到保存点
ROLLBACK TO SAVEPOINT my_first_savepoint;-- 如果一切正常,提交事务
COMMIT;

扩展总结

MySQL 和 SQL Server 事务隔离级别的相同点和不同点

相同点

都支持事务的隔离级别,并通过锁机制来实现隔离性。 SQL Server 和 MySQL 都遵循 SQL 标准,支持四种标准的隔离级别,四种隔离级别基本上一模一样。

锁的相同点

MySQL 和 SQL Server 在使用锁来管理并发访问时,都提供了以下锁类型:

  • 共享锁(Shared Lock, S 锁):用于读取操作,允许多个事务共享读取同一数据,但不能修改数据。
  • 独占锁(Exclusive Lock, X 锁):用于写操作,确保其他事务不能读取或修改加锁的数据。
  • 意向锁(Intent Lock, IS/IX 锁):用于标记一个事务打算在更低粒度的数据对象(如行或页)上加锁,帮助防止死锁。
不同点:
隔离级别的不同点
  • 默认隔离级别

    • MySQL:默认的隔离级别是 REPEATABLE READ,适合大多数并发场景。MySQL 使用的是多版本并发控制(MVCC)来处理事务之间的读取,避免不可重复读,同时结合行锁来保证数据一致性。

    • SQL Server:默认的隔离级别是 READ COMMITTED,这意味着在大多数情况下,SQL Server 会通过短时间持有共享锁,防止读取到未提交的数据(脏读)。并且,SQL Server 提供了 SNAPSHOT 隔离级别,允许事务使用行版本控制(类似 MySQL 的 MVCC)。

隔离级别的实现方式
  • MySQL(InnoDB 存储引擎):
    • MySQL 使用 MVCC(多版本并发控制)来处理大多数读操作,尤其是在 REPEATABLE READ 隔离级别下,事务可以看到数据的多个版本,从而避免锁的争用。
    • REPEATABLE READ 下,MySQL 防止幻读的机制是通过 Next-Key Lock(临近键锁),它会锁定可能被修改或插入的新行。
  • SQL Server
    • SQL Server 默认依赖锁机制来处理数据的读取和写入。READ COMMITTED 和更高的隔离级别下使用共享锁来防止脏读。
    • SQL Server 也提供 SNAPSHOT ISOLATION,它类似于 MySQL 的 MVCC,允许事务在执行时看到数据的一个“快照”,从而避免了使用锁进行读取操作。这个模式是通过行版本控制(Row Versioning)实现的。

小结

1. 隔离级别相似性:
  • MySQL 和 SQL Server 都支持四种标准的隔离级别:READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE
  • 两者都提供了机制来防止脏读、不可重复读和幻读,并通过锁和版本控制技术来实现隔离级别。
2. 隔离级别不同点:
  • 默认隔离级别:MySQL 默认是 REPEATABLE READ,而 SQL Server 默认是 `

相关文章:

mysql事务使用和事务隔离级别与sqlserver的比较

在 MySQL 中,事务 (Transaction) 是一个将一组 SQL 语句作为一个整体执行的机制。事务确保要么所有操作都执行成功,要么在遇到错误时回滚到之前的状态,从而保证数据库数据的一致性和完整性。 事务的四大特性(ACID) 事…...

双光吊舱图像采集详解!

一、图像采集 可见光图像采集: 使用高性能的可见光相机,通过镜头捕捉自然光或人工光源照射下的目标图像。 相机内部通常配备有先进的图像传感器,如CMOS或CCD,用于将光信号转换为电信号。 红外图像采集: 利用红外热…...

1688商品详情关键词数据-API

要利用 Python 爬虫采集 1688 商品详情数据,需要先了解 1688 网站的页面结构和数据请求方式。一般使用 requests 库请求网站的数据,使用 BeautifulSoup 库解析网页中的数据。 以下是一个简单的 Python 爬虫采集 1688 商品详情数据的示例代码&#xff1a…...

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…...

【附源码】Python :打家劫舍

系列文章目录 Python 算法学习&#xff1a;打家劫舍问题 文章目录 系列文章目录一、算法需求二、解题思路三、具体方法源码方法1&#xff1a;动态规划&#xff08;自底向上&#xff09;方法2&#xff1a;动态规划&#xff08;自顶向下&#xff09;方法3&#xff1a;优化的动态…...

YOLO11改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了一种新颖的动态稀疏注意力机制…...

高级Python开发工程师的面试备考指南

目录 博客标题:高级Python开发工程师的面试备考指南:30个面试问题与详细解析岗位职责问题解析1. 公司产品功能开发和代码维护2. 技术方案与项目计划制定3. 算法基础与代码优化4. 项目管理与团队协作任职要求问题解析5. Python 开发经验6. 数据处理相关库(Pandas, Numpy, Mat…...

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…...

23-云原生监控系统

├──23-云原生监控系统 | ├──1-Prometheus监控 | | ├──1-二进制方式部署Prometheus监控系统 | | ├──2-二进制方式部署Prometheus监控系统告警 | | ├──3-容器化构建Prometheus监控系统 | | ├──4-容器监控方案CAdvisor | | └──5-k8s监…...

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机&#xff0c;也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略&#xff0c;对进出的通信流…...

Liquid AI与液态神经网络:超越Transformer的大模型架构探索

1. 引言 自2017年谷歌发表了开创性的论文《Attention Is All You Need》以来&#xff0c;基于Transformer架构的模型迅速成为深度学习领域的主流选择。然而&#xff0c;随着技术的发展&#xff0c;挑战Transformer主导地位的呼声也逐渐高涨。最近&#xff0c;由麻省理工学院(M…...

Spring Boot 进阶-详解Spring Boot中使用Swagger3.0

在上篇文章中我们介绍了Spring Boot 整合Swagger3.0的一些基础用法,这篇文章中我们来深入学习一下Swagger3.0 还有其他高级用法。 在日常的开发中,为了减少工作量,我们会遇到一种情况,就是将前端的接口与后端的接口编写到同一个代码中,这样也提高了代码的复用率,减少了重…...

Linux平台Kafka高可用集群部署全攻略

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《大数据前沿&#xff1a;技术与应用并进》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kafka简介 2、Kafka核心优势 二、环境准备 1…...

Android中有哪些布局方式?

Android中的布局方式是实现用户界面设计的基础&#xff0c;通过合理的布局&#xff0c;可以创建出美观且易用的应用程序界面。Android提供了多种布局方式&#xff0c;每种布局方式都有其特定的应用场景和特点。以下是对Android中主要布局方式的详细介绍&#xff1a; 一、线性布…...

Apache Ranger 70道面试题及参考答案

什么是Apache Ranger? Apache Ranger Apache Ranger 是一个用于 Hadoop 生态系统的集中式安全管理框架,旨在为 Hadoop 及相关大数据技术提供全面的安全解决方案。 它具有以下主要特点和功能: 一、访问控制管理 细粒度的权限控制:可以对 Hadoop 生态系统中的各种组件(如 H…...

2024年9月30日--10月6日(ue5肉鸽结束,20小时,共2851小时)

按照月计划&#xff0c;本周把ue肉鸽游戏完成&#xff0c;然后进行ue5太阳系 &#xff0c; 剩余14节&#xff0c;218分钟&#xff0c;如果按照10分钟的视频教程1小时进行完的话&#xff0c;则需要22小时&#xff0c;分布在10月2日-10月6日之间&#xff0c;每天44分钟的视频教程…...

什么是静态加载-前端

什么是前端静态加载 在前端开发中&#xff0c;静态加载是一种常见且重要的技术。简单来说&#xff0c;前端静态加载指的是在页面加载时将所需的资源&#xff08;如HTML、CSS、JavaScript、图片等&#xff09;一并加载到用户的浏览器中。这种方式有助于提高页面的加载速度和用户…...

(01)python-opencv基础知识入门(图片的读取与视频打开)

前言 一、图像入门 1.1 读取图像cv.imread() 1.2 数组数据转换cv.cvtColor() 1.3数据窗口展示 1.4图像保存 1.5图像的截取 1.6 图像的比例缩放 二、视频入门 参考文献 前言 OpenCV 于 1999 年由 Gary Bradsky 在英特尔创立&#xff0c;第一个版本于 2000 年问世。Vad…...

quic-go实现屏幕广播程序

最近在折腾quic-go, 突然想起屏广适合用udp实现&#xff0c;而http3基于quic-go&#xff0c;后者又基于udp, 所以玩一下。 先贴出本机运行效果图&#xff1a; 功能(实现)说明&#xff1a; 1.服务器先启动作为共享屏幕方&#xff0c;等待客户端连接上来 2.客户端连接 3.客户…...

C#操作SqlServer数据库语句

操作数据库语句 操作数据库语句需要搭配数据库的连接Connection类 和下达SQL命令Command类 1. ExecuteNonQuery ExecuteNonQuery 方法主要用来更新数据。通常使用它来执行Update、Insert和Delete语句&#xff0c;最后执行sql语句的时候可以用一个整形变量来接收&#xff0c;返…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...