事务-介绍与操作四大特性

一.数据准备:

1.员工表:

-- 员工管理
create table tb_emp
(id          int unsigned primary key auto_increment comment 'ID',username    varchar(20)      not null unique comment '用户名',password    varchar(32) default '123456' comment '密码',name        varchar(10)      not null comment '姓名',gender      tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image       varchar(300) comment '图像',job         tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管,5.咨询师',entrydate   date comment '入职时间',dept_id     int unsigned comment '部门ID', -- 属于外键字段,关联部门表的主键IDcreate_time datetime         not null comment '创建时间',update_time datetime         not null comment '修改时间'
) comment '员工表';
​
insert into tb_emp
(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
values (1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()),(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()),(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()),(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()),(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()),(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', 1, now(), now()),(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()),(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()),(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()),(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()),(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 1, '2007-02-01', 3, now(), now()),(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 1, '2008-08-18', 3, now(), now()),(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 2, '2012-11-01', 3, now(), now()),(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()),(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()),(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', 2, now(), now()),(17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', NULL, '2015-03-21', NULL, now(), now());

2.部门表:

-- 部门管理
create table tb_dept
(id          int unsigned primary key auto_increment comment '主键ID',name        varchar(10) not null unique comment '部门名称',create_time datetime    not null comment '创建时间',update_time datetime    not null comment '修改时间'
) comment '部门表';
​
insert into tb_dept (id, name, create_time, update_time)
values (1, '学工部', now(), now()),(2, '教研部', now(), now()),(3, '咨询部', now(), now()),(4, '就业部', now(), now()),(5, '人事部', now(), now());


二.实例:

意味着要删除部门表里的学工部和员工表里在学工部的员工。

代码:
-- =============================================事务=============================================
-- 删除部门
delete from tb_dept where id = 1;
​
​
-- 删除部门下的员工
delete from tb_emp where dept_id = 1;
运行结果:

1.异常情况:

代码:
-- =============================================事务=============================================
-- 删除部门
delete from tb_dept where id = 3;
​
​
-- 删除部门下的员工
delete from tb_emp where dept_id == 3;
运行结果:

出现了异常,只有部门表成功操作,员工表操作失败:

2.问题:可通过事务解决


三.事务:

如果删除一个部门,那么该部门下的员工也就要删除,因此两者应属于一个事务即要么同时成功,要么同时失败,但刚才的例子中删除部门成功,而删除部门对应的员工失败,是因为当执行一条DML语句时,MySQL会立即隐式的提交事务,也就是说,刚才删除部门的SQL语句和删除员工的SQL语句是两个事务。

由此,就需要把删除部门和删除部门下的员工绑定成一个事务。


四.操作:

首先开启事务,所有操作成功之后提交事务,只要有数据操作失败就需要回滚事务,回滚事务就是把所有的数据恢复到操作之前的样子。

注:上图3条语句都属于SQL语句,都需要执行才生效。

如:


五.代码演示事务:

-- =============================================事务=============================================
-- 1.开启事务
start transaction ;/*也可以用begin*/
​
​
-- 删除部门
delete from tb_dept where id = 3;
​
​
-- 删除部门下的员工
delete from tb_emp where dept_id = 3;
​
​
​
-- 2.提交事务
commit ;
​
​
-- 3.回滚事务
rollback ;
​
​
select * from tb_dept;
select * from tb_emp;

1.部门表和员工表:

2.开启事务并执行绑定为事务的SQL语句:

运行结果:带绿箭头的语句代表已经执行过

在别的窗口中此时id为3的部门和该部门下的员工并没有被删除,是因为还没有提交事务,两者还是隔离的(尽管刷新后看到的已经删除了,但并没有真正意义上的删除,两个窗口也属于两个事务)。

在开启事务的窗口中查看部门表和员工表:同一个窗口下属于一个事务,可以看到id为3的部门和该部门下的员工被删除

3.提交事务:

此时别的窗口中就可以看到正确的结果了。

4.异常情况:

a.代码:
-- =============================================事务=============================================
-- 1.开启事务
start transaction ;/*也可以用begin*/
​
​
-- 删除部门
delete from tb_dept where id = 2;
​
​
-- 删除部门下的员工
delete from tb_emp where dept_id == 2;
​
​
​
-- 2.提交事务
commit ;
​
​
-- 3.回滚事务
rollback ;
​
​
select * from tb_dept;
select * from tb_emp;
b.开启事务:

c.执行SQL语句:

2条SQL语句中只成功操作了部门表,员工表操作失败。

先不提交事务,因为提交事务是所有操作成功后才进行的操作,如果有操作失败,就必须先回滚事务

部门表和员工表的运行结果:部门表操作成功,员工表操作失败

由此就需要回滚事务。

d.回滚事务(只要有操作失败就要回滚事务):

部门表和员工表数据恢复到操作之前的样子:

所以一旦出现异常,就可以通过回滚事务将删除掉的数据恢复,从而保证在操作前后数据的一致性和完整性。


六.事务的四大特性:

1.一致性:无论提交事务还是回滚事务,都算事务完成,所有的数据都必须保持一致性。比如刚才的例子,事务完成后要么部门和该部门下的员工都还在,要么部门和该部门下的员工都没有,不能是部门没有了,而该部门下的员工还在。

2.隔离性:在一个窗口下还没有提交事务,在另一个窗口下就无法看到最终结果,即使看到了,也不是正在意义上的。隔离性可以通过隔离级别来设置,隔离性越高,事务越安全,但效率越低,所以隔离性很少手动控制。


七.总结:


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

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

相关文章

Golang学习历程【第一篇 入门】

Golang学习历程【第一篇 入门Hello World】 1. 学习文档2. Window 本地安装Go2.1 安装2.2 验证 3. 开发环境——VsCode3.1 VsCode 安装3.2 安装插件3.2.1 language 语言汉化插件安装3.2.2 Go插件安装 4. Hello World 入门4.1 建工程4.2 创建项目文件4.3 编写Hello World程序4.4…

微积分复习笔记 Calculus Volume 2 - 4.3 Separable Equations

4.3 Separable Equations - Calculus Volume 2 | OpenStax

Metaploit-永恒之蓝漏洞利用

1:Metaploit介绍   本次测试主要是利用永恒之蓝漏洞对windows7进行控制利用,掌握Metaploit工具的使用,知道永恒之蓝的漏洞利用原理。永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可…

电容Q值、损耗角、应用

电容发热的主要原因:纹波电压 当电容两端施加纹波电压时,电容承受的是变化的电压,由于电容内部存在寄生电阻(ESR)和寄生电感(ESL).因此电容会有能量损耗,从而产生热量,这…

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时,发现引入了一个 wallpaper 库,这个库的入口文件是 index.js,但是 package.json 文件下的 type:"module",这样造成了无论你使用 import from 还是 require&…

【计算机网络篇】计算机网络期末复习题库详解

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯单选 🎯填空 &am…

JS使用random随机数实现简单的四则算数验证

1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片

SLM510A 系列产品是单通道、高精度、可调电流线性恒流源的 LED 驱动芯片&#xff0c;在各种 LED 照明产品中非常简单易用。其在宽电压输入范围内&#xff0c;能保证极高的输出电流精度&#xff0c;从而在大面积的光源照明中&#xff0c;都能让 LED 照明亮度保持均匀一致。 由于…

【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性

目录 为什么Java Web开发如此重要&#xff1f; 1. 现代开发的核心技能 2. 增强系统设计与架构思维 3. 实战经验积累 Java Web开发的关键技术栈 案例&#xff1a;构建一个简单的Java Web应用 1. 创建数据库 2. 创建Java类 3. 创建数据库连接工具类 4. 创建DAO类 5. 创…

如何在 .NET Core 中轻松实现异步编程并提升性能

目录 初识异步编程 与多线程关系 异步编程操作 初识异步编程 异步编程&#xff1a;是指在执行某些任务时程序可以在等待某个操作完成的过程中继续执行其他任务&#xff0c;而不是阻塞当前线程&#xff0c;这在处理I/O密集型操作(如文件读取、数据库查询、网络请求等)时尤为重…

麒麟操作系统服务架构保姆级教程(二)ssh远程连接

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 作为一名成熟运维架构师&#xff0c;我们需要管理的服务器会达到几十台&#xff0c;上百台&#xff0c;上千台&#xff0c;甚至是上万台服务器&#xff0c;而且咱们的服务器还不一定都在一个机房&am…

159.等差数列的划分

class Solution {public int numberOfArithmeticSlices(int[] nums) {int lenums.length;if(le<3){return 0;}int arith0,res0,count0;//arith是差的大小,res是结果,count计算等差数量for(int i1;i<le;i){if(nums[i]-nums[i-1]arith){count;if(count>2){rescount-1;}}…

RabbitMQ消息队列的笔记

Rabbit与Java相结合 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在配置文件中编写关于rabbitmq的配置 rabbitmq:host: 192.168.190.132 /…

纯css 实现呼吸灯效果

开始效果 呼吸效果 实现代码 <div class"container"><div class"breathing-light"></div> </div><style>html,body {height: 100%;background-color: white;}.container {padding: 100px;}.container .breathing-light {wi…

进程通信方式---共享映射区(无血缘关系用的)

5.共享映射区&#xff08;无血缘关系用的&#xff09; 文章目录 5.共享映射区&#xff08;无血缘关系用的&#xff09;1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理&#xff1a;共享映射区是将文件…

《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制

从本节课程开始&#xff0c;我们将来介绍K8s安全框架&#xff0c;这是保障K8s集群安全比较关键的安全机制。接下来&#xff0c;让我们一起来探索K8s安全框架的运行机制。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全框架&#xff1a;由认证、鉴权和准入控…

day08-别名-重定向-去重排序等

1.重复用touch命令创建同一份文件&#xff0c;会修改文件的时间戳。 alias命令&#xff1a; 别名 查看已有别名&#xff1a;alias [rootoldboy ~]# alias alias cpcp -i alias egrepegrep --colorauto alias fgrepfgrep --colorauto alias grepgrep --colorauto alias l.ls…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础&#xff0c;总结的还行&#xff1b; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

计算机视觉中的特征提取算法

摘要&#xff1a; 本文聚焦于计算机视觉中的特征提取算法&#xff0c;深入探讨尺度不变特征变换&#xff08;SIFT&#xff09;算法。详细阐述 SIFT 算法的原理&#xff0c;包括尺度空间构建、关键点检测、方向分配与特征描述子生成等核心步骤。通过 C#、Python 和 C 三种编程语…