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

一.数据准备:

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.rhkb.cn/news/491863.html

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

相关文章

[白月黑羽]关于风机协议工具的解答

架构 python3.8pyqt5 先来看下原题: 视频中软件的效果 先来看下程序的效果如何,看上去大概相似 对应代码已经上传到了gitcode https://gitcode.com/m0_37662818/fan_protocol_tool/overview 实现中的难点是双悬浮可视化,同时要高亮悬浮对…

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表

大型网络的拓扑结构一般会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…

ISCTF复现-misc

File_Format 下载附件后用010打开查看文件头会发现是个exe文件 格式:文件描述(后缀名),文件头(hex):文件头标识(十六进制)PNG (png),文件头(hex):89504E47 PNGImageFile…

Windows设置所有软件默认以管理员身份运行

方法一、修改注册表 winr打开运行,输入“regedit”打开注册表; 打开此路径“计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem”; 在右侧找到“EnableLUA”,将其值改为0,重启电脑。 …

【题解】—— LeetCode一周小结50

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结49 9.判断国际象棋棋盘中一个格子的颜色 题目链接:…

Docker安全性与最佳实践

一、引言:Docker安全性的重要性 Docker作为一种容器化技术,已成为现代应用程序部署和开发的核心工具。然而,随着容器化应用的普及,Docker的安全性问题也日益突出。容器本身的隔离性、网络配置、权限管理等方面的安全隐患&#xf…

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H,查找模式选择 ‘正则表达式’,不选 ‘.匹配新行’ 2、查找目标输入 : ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为:(空) 配置界面参考下图: ​​…

上传图片的预览

解决:在上传图片时,1显示已有的图片 2显示准备替换的图片 前 后 在这个案例中可以预览到 【已有与准备替换】 2张图片 具体流程 1创建一个共享组件 与manage.py同级别路径的文件 manage.py custom_widgets.py# custom_widgets.py from django import forms from dja…

MySQL学习之DDL操作

目录 数据库的操作 创建 查看 选择 删除 修改 数据类型 表的创建 表的修改 表的约束 主键 PRIMARY KEY 唯一性约束 UNIQUE 非空约束 NOT NULL 外键约束 约束小结 索引 索引分类 常规索引 主键索引 唯一索引 外键索引 优点 缺点 视图 创建 删除 修改…

国际网络专线是什么?有什么优势?

国际网络专线作为一种独立的网络连接方式,通过卫星或海底光缆等物理链路,将全球不同国家和地区的网络直接互联,为企业提供了可靠的通信渠道。本文将详细探讨国际网络专线的优势以及其广泛的应用场景。 国际网络专线的优势解析 1. 专属连接&am…

密码编码学与网络安全(第五版)答案

通过如下代码分别统计一个字符的频率和三个字符的频率,"8"——"e",“;48”——“the”,英文字母的相对使用频率,猜测频率比较高的依此为),t,*,5,分别对应s,o,n,…

【功能安全】随机硬件失效导致违背安全目标的评估(FMEDA)

目录 01 随机硬件失效介绍 02 FMEDA介绍 03 FMEDA模板 01 随机硬件失效介绍 GBT 34590 part5

mybatis 的动态sql 和缓存

动态SQL 可以根据具体的参数条件,来对SQL语句进行动态拼接。 比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 1 来作为前缀,然后后面用AND 拼接要查询的参数,这样,就算要查询…

Web APIs - 第5章笔记

目标: 依托 BOM 对象实现对历史、地址、浏览器信息的操作或获取 具备利用本地存储实现学生就业表案例的能力 BOM操作 综合案例 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。 比如:变量、分支语句、循环语句、对象等等 Web APIs : DO…

AI视频配音技术创新应用与商业机遇

随着人工智能技术的飞速发展,AI视频配音技术已经成为内容创作者和营销人员的新宠。这项技术不仅能够提升视频内容的吸引力,还能为特定行业带来创新的解决方案。本文将探讨AI视频配音技术的应用场景,并讨论如何合法合规地利用这一技术。 AI视频…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

Java每日一题(1)

给定n个数a1,a2,...an,求它们两两相乘再相加的和。 即:Sa1*a2a1*a3...a1*ana2*a3...an-2*an-1an-2*anan-1*an 第一行输入的包含一个整数n。 第二行输入包含n个整数a1,a2,...an。 样例输入 4 1 3 6 9 样例输出 117 答案 import java.util.Scanner; // 1:无…

Redis应用—6.热key探测设计与实践

大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的组成 7.热key探测框架JdHotkey的工作流程 8.热key探测框架JdHotkey的性能表现 9.关于热key探测框架JdHotke…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者:来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么? Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

python爬虫入门教程

安装python 中文网 Python中文网 官网 安装好后打开命令行执行(如果没有勾选添加到Path则注意配置环境变量) python 出现如上界面则安装成功 设置环境变量 右键我的电脑->属性 设置下载依赖源 默认的是官网比较慢,可以设置为清华大…