MySQL之事务初步

news2024/10/5 12:52:46

0. 数据源

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80016
 Source Host           : localhost:3306
 Source Schema         : tempdb

 Target Server Type    : MySQL
 Target Server Version : 80016
 File Encoding         : 65001

 Date: 23/05/2023 22:01:41
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `c_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`num`) USING BTREE,
  INDEX `f_std_cls`(`c_id`) USING BTREE,
  INDEX `index_test2`(`age`) USING BTREE,
  INDEX `index_test3`(`name`, `age`) USING BTREE,
  CONSTRAINT `f_std_cls` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (102, '王五', 34, '4334', 2);
INSERT INTO `student` VALUES (104, '赵无极', 23, '4234', 1);
INSERT INTO `student` VALUES (105, '韩夫子', 34, '23', 2);
INSERT INTO `student` VALUES (106, '高俅', 25, '42543', 4);
INSERT INTO `student` VALUES (107, '范瑶', 26, '2345', NULL);
INSERT INTO `student` VALUES (108, '斯巴达克斯', 27, '422156 ', NULL);

SET FOREIGN_KEY_CHECKS = 1;

1. 概念

把完成特定业务的多个数据库DML操作步骤称之为⼀个事务,事务就是完成同⼀个业务的多个DML操作。

-- 借书业务
-- 操作1:在借书记录表中添加记录
-- 操作2:修改图书库存

-- 转账业务:张三给李四转账1000
-- 操作1:李四的帐号+1000
-- 操作2:张三的账户-1000

2. 特性

原⼦性(Atomicity):⼀个事务中的多个DML操作,要么全部执⾏成功,要么全部执⾏失败;
⼀致性(Consistency):事务执⾏之前和事务执⾏之后,数据库中的数据是⼀致的,完整性和⼀致性不能被破坏;
隔离性(Isolation):数据库允许多个事务同时执⾏(张三借Java书的同时允许李四借Java书),多个
加粗样式并行的事务之间不能相互影响;
持久性(Durability):事务完成之后,对数据库的操作是永久的。

3. 事务管理

3.1 ⾃动提交
在MySQL中,默认DML指令执⾏时⾃动提交的,当我们执⾏⼀个DML指令之后,⾃动同步到数据库中。

在这里插入图片描述
3.2 事务流程
(1)开启事务,就是关闭⾃动提交。在开始事务之前,执⾏ start transaction; 开启事务;
(2)依次执⾏事务中的每个DML操作;
(3)如果在执⾏过程中的任何位置发生异常,则执⾏ rollback; 回滚事务;
(4)如果事务中所有的DML操作都执⾏成功,则在最后执⾏ commit; 提交事务;

-- 开启事务
start TRANSACTION;

-- DML相关操作
update student set name='王五五' where name='王五'; 
delete from student where num=103;

-- 如果发生错误,则回滚
rollback;

-- 否则,提交事务,将数据同步到数据库中
commit; 

4. 事务隔离级别

数据库允许多个事务并⾏,多个事务之间是隔离的、相互独⽴的;如果事务之间不相互隔离并且操作同⼀数据时,可能会导致数据的⼀致性被破坏。

4.1 读未提交
T2可以读取T1执⾏但未提交的数据;可能会导致出现脏读。
脏读,⼀个事务读取到了另⼀个事务中未提交的数据。

在这里插入图片描述

4.2 读已提交

T2只能读取T1已经提交的数据;避免了脏读,但可能会导致不可重复读(虚读)。
不可重复读(虚读) : 在同⼀个事务中,两次查询操作读取到数据不⼀致。

例如: T2进⾏第⼀次查询之后在第⼆次查询之前, T1修改并提交了数据, T2进⾏第⼆次
查询时读取到的数据和第⼀次查询读取到数据不⼀致。

在这里插入图片描述

4.3 可重复读

T2执⾏第⼀次查询之后,在事务结束之前其他事务不能修改对应的数据;避免了不可重复读(虚读),但可能会导致幻读。

幻读, T2对数据表中的数据进⾏修改然后查询,在查询之前T1向数据表中新增了⼀条数据,就导致T2以为修改了所有数据,但却查询出了与修改不⼀致的数据(T1事务新增的数据)。

在这里插入图片描述

4.4 串行化

同时只允许⼀个事务对数据表进⾏操作;避免了脏读、虚读、幻读问题。

我们可以通过设置数据库默认的事务隔离级别来控制事务之间的隔离性;
也可以通过客户端与数据库连接设置来设置事务间的隔离性(在应⽤程序中设置–Spring);

MySQL数据库默认的隔离级别为 可重复读。

(1)查看MySQL数据库默认的隔离级别

-- 在MySQL8.0.3 之前
select @@tx_isolation;

-- 在MySQL8.0.3 之后
select @@transaction_isolation;

在这里插入图片描述

(2)设置MySQL默认隔离级别

set session transaction isolation level <read committed>;

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

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

相关文章

在线OJ常用输入规则

一、字符串输入规则 1.1 单行无空格字符串输入 输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 string s; //输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 cin >> s; 1.2 单行有空格字符串输入 getline函数接受带有空格的输入流&#xff…

C++——初识模板

文章目录 总述为什么要有模板函数模板概念函数模板使用方法函数模板的原理函数模板的实例化隐式示例化显式实例化 模板参数的匹配规则 类模板类模板的实例化 总述 本篇文章将带大家简单的了解一下c的模板方面的知识&#xff0c;带大家认识什么是模板&#xff0c;模板的作用&…

STL-常用算法(一.遍历 查找 排序)

目录 常用遍历算法&#xff1a; for_each和transform函数示例&#xff1a; 常用查找算法&#xff1a; find函数示例&#xff1a; find_if函数示例&#xff1a; adjacent_find示例&#xff1a; binary_search函数示例&#xff1a; count函数示例&#xff1a; count_if函…

训练/测试、过拟合问题

在机器学习中&#xff0c;我们创建模型来预测某些事件的结果&#xff0c;比如之前使用重量和发动机排量&#xff0c;预测了汽车的二氧化碳排放量 要衡量模型是否足够好&#xff0c;我们可以使用一种称为训练/测试的方法 训练/测试是一种测量模型准确性的方法 之所以称为训练…

springmvc升级到springboot2踩的坑

声明:删除springmvc的jar配置改成springboot的&#xff0c;若别的组件依赖springboot该升级就升级&#xff0c;该删掉就删掉&#xff0c;此文章只记录升级后的坑&#xff0c;升级springboot所需的jar请自行百度。 一.Hibernate的坑 概念:jpa和Hibernate的关系&#xff0c;jpa…

【JAVAEE】网络编程的简单介绍及其实现

目录 1.什么是网络编程 网络编程中的基本概念 常见的客户端服务端模型 2.Socket套接字 Socket套接字分类 举例对比TCP和UDP 3.UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 4.实现一个简单的UDP回显服务器与客户端 服务端与客…

当前最新免费使用GPT-4方法汇总

目录 前言 温馨提示 Ora AI 使用方式 使用测试 Forefont chat 使用方式 使用测试 Perplexity AI 使用方式 使用测试 Poe 总结 前言 目前GPT-4的收费对于大多数人而言都还是不便宜&#xff0c;且付费方式复杂&#xff0c;使用上还有每3小时25个问题的限制&#xff…

Aspose.OCR For NET 23.5 Crack

使用几行代码将光学字符识别 (OCR) 添加到您的 .NET 应用程序。 适用于 .NET 的 Aspose.OCRAspose.OCR 文档 Aspose.OCR for .NET 是一个功能强大但易于使用且具有成本效益的光学字符识别 API。有了它&#xff0c;您可以用不到 5 行代码将 OCR 功能添加到您的 .NET 应用程序…

【Linux】初识优雅的Linux编辑器——Vim

❤️前言 大家好&#xff01;今天给大家带来的博客内容是关于Linux操作系统下的一款多模式文本编辑器Vim。本文将和大家一起来了解Vim编辑器的一些基础知识。 正文 Vim是一个多模式的文本编辑器(一共有十二种模式)&#xff0c;其中我们当我们初学Vim时主要了解如下三种工作模式…

Linux——多线程(线程概念|进程与线程|线程控制)

目录 地址空间和页表 如何看待地址空间和页表 虚拟地址如何转化到物理地址的 线程与进程的关系 什么叫进程&#xff1f; 什么叫线程&#xff1f; 如何看待我们之前学习进程时&#xff0c;对应的进程概念呢&#xff1f;和今天的冲突吗&#xff1f; windows线程与linux线…

Leetcode665. 非递减数列

Every day a Leetcode 题目来源&#xff1a;665. 非递减数列 解法1&#xff1a;贪心 本题是要维持一个非递减的数列&#xff0c;所以遇到递减的情况时&#xff08;nums[i] > nums[i 1]&#xff09;&#xff0c;要么将前面的元素缩小&#xff0c;要么将后面的元素放大。 …

K8s in Action 阅读笔记——【2】First steps with Docker and Kubernetes

K8s in Action 阅读笔记——【2】First steps with Docker and Kubernetes 2.1 Creating, running, and sharing a container image 2.1.1 Installing Docker and running a Hello World container 在电脑上安装好Docker环境后&#xff0c;执行如下命令&#xff0c; $ dock…

真会玩:莫言用ChatGPT为余华写了一篇获奖词

5月16日&#xff0c;《收获》杂志65周年庆典暨新书发布活动在上海舞蹈中心举行。 典礼现场&#xff0c;余华凭借《文城》获得收获文学榜2021年长篇小说榜榜首。 作为老友&#xff0c;莫言在颁奖时故意卖了个关子&#xff1a;“这次获奖的是一个了不起的人物&#xff0c;当然了&…

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE&#xff0c;例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图&#xff0c;以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间&#xff0c;则它应为 org.simalliance.openmob…

Foxit PDF SDK OCR Add-on Library (C++, Windows)-Crk

OCR文档扫描--Crack version 使用Foxit PDF SDK OCR Add-on的光学字符识别&#xff08;OCR&#xff09;软件将扫描的文档转换为可搜索的文本PDF。专为扫描、归档和数字化而设计&#xff0c;我们的插件输出13种不同的文件格式&#xff0c;包括PDF和PDF/A。 在不投资数据输入人员…

Linux 禁用23端口

禁用23端口 前言 23端口是用于Telnet服务的默认端口。Telnet是一种早期的网络协议&#xff0c;允许用户使用一个远程终端连接到远程计算机上&#xff0c;以便在远程计算机上执行命令和操作。通过输入用于Telnet服务器的IP地址和端口号&#xff0c;用户可以在本地计算机上打开一…

【Java|golang】1090. 受标签影响的最大值---关联数组排序问题以及切片排序失败

我们有一个 n 项的集合。给出两个整数数组 values 和 labels &#xff0c;第 i 个元素的值和标签分别是 values[i] 和 labels[i]。还会给出两个整数 numWanted 和 useLimit 。 从 n 个元素中选择一个子集 s : 子集 s 的大小 小于或等于 numWanted 。 s 中 最多 有相同标签的 …

数据结构初阶--栈和队列OJ题

目录 前言有效的括号思路分析代码实现 用队列实现栈思路分析代码实现 用栈实现队列思路分析代码实现 设计循环队列思路分析代码实现 前言 本篇文章将对部分栈和队列综合运用题进行讲解&#xff0c;以对栈和队列有一个更深层次的理解。 有效的括号 先来看题 思路分析 这里…

优秀的流程图应该怎么设计呢?

优秀的流程图应该怎么绘制呢&#xff1f; 本文将带大家学习优秀流程图的绘制要点和技巧&#xff0c;以及讲解流程图与UML活动图、BPMN图之间的关系和区别。 1、认识流程图 流程图简单讲就是用图描述流程&#xff0c;这种流程可以是一种有先后顺序的操作组成&#xff0c;可以…

2024王道数据结构考研丨第六篇:查找、排序

到此&#xff0c;2024王道数据结构考研笔记专栏“基础知识”部分已更新完毕&#xff0c;其他内容持续更新中&#xff0c;欢迎 点此 订阅&#xff0c;共同交流学习… 文章目录 第七章 查找7.1查找表相关概念 第八章 排序8.1排序的基本概念8.2 插入排序8.2.1直接插入排序8.2.2折半…