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

news2024/11/18 22:30:47

在 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 默认是 `

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

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

相关文章

RISC-V笔记——基础

1. 前言 RISC-V旨在支持广泛的定制和专业化。RISC-V的ISA是由一个基本整型ISA和其它对基本ISA的可选扩展组成。每个整型ISA可以使用一个或多个可选的ISA扩展进行扩展。 基本整型ISA精选了最小的一组指令,这些指令足以为编译器、汇编器、链接器和操作系统提供足够的…

iPhone相册怎么删除相同照片

我们都太喜爱用iPhone拍照了,我们的iPhone相册就像是一个永远不想清理的衣柜,堆满了各种美好瞬间和意外的重复照片。面对成百上千的照片,有时候我们不禁想:这些相同的照片到底是怎么混进来的?今天,就让我来…

SpringBoot集成RocketMQ实现六种消息

1. 简介 RocketMQ 支持多种消息类型以满足不同的业务需求 普通消息(Standard Message): 这是最常用的消息类型,适用于大多数场景。 可以设置延迟级别(Delay Levels),但不支持消息轨迹。 顺序消…

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析d…

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表

Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表 初始数据 filename C:\Users\jia\Desktop\yadian\data\1Hz 2024_09_12 17_10_06.csv; 代码: clc;clear close all; % 读取Excel文件 filename C:\Users\jia\Desktop\yadian\data\1Hz …

一篇文章让你学懂python入门

1.编写程序输入三个整数,按升序输出 思路1:使用if-else结构进行大小比较,将三个数进行从小到大的排序 num1 int(input("请输入第一个整数:")) num2 int(input("请输入第二个整数:")) num3 int(input(&qu…

华为OD机试 - 采样过滤(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

MySQL数据的增删改查

CRUD CRUD指的是创建(Create),读取(Retrieve),更新(Update)和删除(Delete),它是数据库或者持久层在软件系统中执行的基本功能,构成了大多数应用程序和服务器…

图神经网络之异构图转同构图

heterogeneous graph转homogeneous 异构图创建教程dgl.to_homogeneous语法格式例子 异构图创建教程 对于异构图创建,可以看异构图创建教程 dgl.to_homogeneous语法格式 dgl.to_homogeneous(G, ndataNone, edataNone, store_typeTrue, return_countFalse)G&#x…

K8s简介及环境搭建

一、Kubernetes简介 kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能: 自我修复:一旦某一个容器崩溃&a…

使用HashiCorp Nomad Cluster App管理高可用集群

容器化和Kubernetes如今已成为创建可扩展云原生应用程序的基本要素。但并非每个应用程序工作负载都需要容器或Kubernetes资源。HashiCorp Nomad是一个轻量级的工作负载调度程序,提供了与Kubernetes相似的优势,但不仅可以管理容器,还能管理其他…

SSL证书是否可以给多个域名使用?

在当今数字化的网络环境中,SSL证书在保障网站安全、保护用户数据传输方面发挥着至关重要的作用。那么,SSL 证书是否可以给多个域名使用呢?这是一个在网站开发、运营和安全管理领域备受关注的问题。 SSL 证书能够给多个域名使用吗&#xff1f…

指针函数C++

指针函数概念 指针函数在C中是一种特殊类型的函数。从本质上讲,它是一个函数,不过其返回值是一个指针类型的数据。例如,像int* plusfunction(int a, int b);这样的函数声明,plusfunction就是一个指针函数,它接受两个i…

Jvisualvm介绍;使用Jvisualvm:运行jvisualvm.exe;安装gc插件;查看gc

一,Jvisualvm介绍 jvisualvm是用来查看硬件使用情况的工具,多数会用它来看内存的使用情况 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe)&#xff0c…

leetcode 10.9 94.二叉树的中序遍历

94. 二叉树的中序遍历 已解答 简单 相关标签 相关企业 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出&#xff1a…

LabelImag标注工具环境配置

LabelImag标注工具环境配置 Anaconda的安装和使用 Anaconda是一个集成了Python解释器、conda包管理器和众多科学计算、数据分析、机器学习等常用库的发行版。它允许用户轻松地管理Python环境和包,无需手动解决依赖问题。Anaconda特别适用于数据科学、机器学习、人…

Mac 下编译 libaom 源码教程

AV1 AV1是一种开放、免版税的视频编码格式,由开放媒体联盟(AOMedia)开发,旨在提供高压缩效率和优秀的视频质量。AV1支持多种分辨率,包括SD、HD、4K和8K,并适用于视频点播(VOD)、直播…

Python酷库之旅-第三方库Pandas(139)

目录 一、用法精讲 626、pandas.plotting.scatter_matrix方法 626-1、语法 626-2、参数 626-3、功能 626-4、返回值 626-5、说明 626-6、用法 626-6-1、数据准备 626-6-2、代码示例 626-6-3、结果输出 627、pandas.plotting.table方法 627-1、语法 627-2、参数 …

从0开始linux(11)——进程(3)进程的切换与调度

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 进程优先级进程的切换linux的调度算法 进程优先级 进程的优先级决定了进程获得CPU资源分配的顺序,在进程(0)这篇文章中博主就讲过并发和并行两个概念。即对…

ai论文写作软件哪个好?分享5款ai论文题目生成器

在当前的学术研究和写作领域,AI论文写作软件已经成为提高效率和质量的重要工具。根据多个来源的评测和推荐,以下是五款值得推荐的AI论文写作软件,其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…