十八、MySQL之TCL事务控制语言(详解)

TCL :

Transaction Control Language 事务控制语言

零、MySQL 中的存储引擎

1、概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
2、通过show engines;来查看mysql支持的存储引擎。
3、 在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而myisam、memory等不支持事务
在这里插入图片描述

一、事务:

事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

案例:转账

张三丰 1000 郭襄 1000

update 表 set 张三丰的余额=500 where name=‘张三丰’
意外
update 表 set 郭襄的余额=1500 where name=‘郭襄’

事务的特性:ACID
1. 原子性:一个事务不可再分割,要么都执行要么都不执行
2. 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
3. 隔离性:一个事务的执行不受其他事务的干扰
4. 持久性:一个事务一旦提交,则会永久的改变数据库的数据.

二、事务的创建

  1. 隐式事务:事务没有明显的开启和结束的标记
    比如insert、update、delete语句
    delete from 表 where id =1;
    在这里插入图片描述

  2. 显式事务:事务具有明显的开启和结束的标记
    前提:必须先设置自动提交功能为禁用
    set autocommit=0;
    在这里插入图片描述

步骤1:开启事务
set autocommit=0;必须写
start transaction;可省略不写
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
...步骤3:结束事务
commit;提交事务
或者
rollback;回滚事务savepoint 节点名;设置保存点

三、事务的隔离级别:

脏读不可重复读幻读
read uncommitted
read committedX
repeatable readXX
serializableXXX

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没
有采取必要的隔离机制, 就会导致各种并发问题:

  1. 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
  2. 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
  3. 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔
离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就
越好, 但并发性越弱.

数据库提供的 4 种事务隔离级别:
在这里插入图片描述
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务是第二个隔离级别为: READ COMMITED
Mysql 支持 4 种事务隔离级别. Mysql 默认的事务是第三个隔离级别为: REPEATABLE READ

  1. 查看隔离级别
    select @@tx_isolation;
  2. 设置隔离级别
    set session|global transaction isolation level 隔离级别;
  3. 开启事务的语句;
    update 表 set 张三丰的余额=500 where name=‘张三丰’
    update 表 set 郭襄的余额=1500 where name=‘郭襄’
    结束事务的语句;

每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.

  • 查看当前的隔离级别: SELECT @@tx_isolation;
  • 设置当前 mySQL 连接的隔离级别:
    set transaction isolation level read committed;
  • 设置数据库系统的全局的隔离级别:
    set global transaction isolation level read committed;

在这里插入图片描述
在这里插入图片描述

四、代码演示

SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES;

1.演示事务的使用步骤

#开启事务
SET autocommit=0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 1000 WHERE username='张无忌';
UPDATE account SET balance = 1000 WHERE username='赵敏';#结束事务
ROLLBACK;
#commit;SELECT * FROM account;

在这里插入图片描述
在这里插入图片描述
2. 演示事务对于delete和truncate的处理的区别:
在事务中,delete 删除表是支持rollback回滚的;
但是,truncate 删除表是不支持rollback回滚

# 2. delete 和 truncate 在事务使用时的区别
# 演示delete
set autocommit=0;
start transaction;
delete from account;
ROLLBACK;# 演示truncate
set autocommit=0;
start transaction;
truncate TABLE account;
ROLLBACK;
SELECT * from account;

在这里插入图片描述
在这里插入图片描述

  1. 演示savepoint 的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=1;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=2;
ROLLBACK TO a;#回滚到保存点SELECT * FROM account;

在这里插入图片描述

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

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

相关文章

LeetCode 2220. 转换数字的最少位翻转次数(位运算)

文章目录1. 题目2. 解题1. 题目 一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转 操作,即将 0 变成 1 ,或者将 1 变成 0 。 比方说,x 7 ,二进制表示为 111 ,我们可以选择任意一个位(包含没有显示…

LeetCode 2221. 数组的三角和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,其中 nums[i] 是 0 到 9 之间(两者都包含)的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值: nums 初始包含 n 个元素。如果 n 1 &…

移动web开发之rem布局(rem基础、媒体查询、 less 基础、rem适配方案)

移动web开发之rem布局 一、rem基础 rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。 不同的是rem的基准是相对于html元素的字体大小。 比如,根元素(html)设置font-size12px; 非根元素设置wid…

LeetCode 2222. 选择建筑的方案数

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二进制字符串 s ,它表示一条街沿途的建筑类型,其中: s[i] 0 表示第 i 栋建筑是一栋办公楼,s[i] 1 表示第 i 栋建筑是一间餐厅。 作为市政厅的官员,你需要随…

LeetCode 2224. 转化时间需要的最少操作数(贪心)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 current 和 correct ,表示两个 24 小时制时间 。 24 小时制时间 按 "HH:MM" 进行格式化,其中 HH 在 00 和 23 之间,而 MM 在 00 和 59 之间。 最早的 24 小时制时间为 00:00 &…

移动端WEB开发之响应式布局(响应式开发原理、bootstrap、阿里百秀案例)

移动端WEB开发之响应式布局 1.1 响应式开发原理 就是使用媒体查询针对不同宽度的设备进行布局和样式的设置&#xff0c;从而适配不同设备的目的。 设备的划分情况&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><…

jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例

day03 - jQuery 学习目标&#xff1a; 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 能够说出 jQuery 对象的拷贝方法 能够说出 jQuery 多库共存的2种方法 能够使用 jQuery 插件 1.1. jQuery 事件…

LeetCode 2225. 找出输掉零场或一场比赛的玩家(计数)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 matches 其中 matches[i] [winneri, loseri] 表示在一场比赛中 winneri 击败了 loseri 。 返回一个长度为 2 的列表 answer &#xff1a; answer[0] 是所有 没有 输掉任何比赛的玩家列表。answer[1] 是所有恰好输掉 一场 比…

LeetCode 2226. 每个小孩最多能分到多少糖果(二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个 下标从 0 开始 的整数数组 candies 。数组中的每个元素表示大小为 candies[i] 的一堆糖果。你可以将每堆糖果分成任意数量的 子堆 &#xff0c;但 无法 再将两堆合并到一起。 另给你一个整数 k 。你需要将这些糖果分配给 k 个小孩&am…

指令系统——数据寻址(3)——堆栈寻址(详解)

一、总览 二、堆栈寻址 堆栈寻址&#xff1a;操作数存放在堆栈中&#xff0c;隐含使用堆栈指针&#xff08;SP&#xff09;作为操作数地址。堆栈是存储器&#xff08;或专用寄存器组&#xff09;中一块特定的按“后进先出&#xff08;LIFO&#xff09;” 原则管理的存储区&…

指令系统 CISC和RISC(详解)

一、总览 二、CISC CISC:Complex Instruction Set Computer设计思路&#xff1a;一条指令完成一个复杂的基本功能。代表&#xff1a;86架构&#xff0c;主要用于笔记本、台式机等。 80-20规律&#xff1a;典型程序中80%的语句仅仅使用处理机中20%的指令 三、RISC RISC:Reduc…

LeetCode 2231. 按奇偶性交换后的最大数字

文章目录1. 题目2. 解题1. 题目 给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字&#xff08;即&#xff0c;都是奇数或者偶数&#xff09;。 返回交换 任意 次之后 num 的 最大 可能值。 示例 1&#xff1a; 输入&#xff1a;num 1234 输出&#xff1a…

亲密接触Redis-第一天

引言nosql&#xff0c;大规模分布式缓存遍天下&#xff0c;Internet的时代在中国由其走得前沿&#xff0c;这一切归功于我国特色的电商。因此nosql、大数据技术在中国应用的比国外还要前沿。从这一章开始我们将开始进入到真正的SOA、PAAS、SAAS、互联网的领域&#xff0c;因此每…

Ajax 编程基础(一)

一、Ajax 基础 传统网站中存在的问题&#xff1a; 网速慢的情况下&#xff0c;页面加载时间长&#xff0c;用户只能等待表单提交后&#xff0c;如果一项内容不合格&#xff0c;需要重新填写所有表单内容页面跳转&#xff0c;重新加载页面&#xff0c;造成资源浪费&#xff0c…

LeetCode 2232. 向表达式添加括号后的最小结果

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 expression &#xff0c;格式为 "<num1><num2>" &#xff0c;其中 <num1> 和 <num2> 表示正整数。 请你向 expression 中添加一对括号&#xff0c;使得在添加之后&#xff0…

一、服务端开发基础(搭建Web服务器、网络基础概念、请求响应流程、配置Apache、静态网站与动态网站)

一、建立你的第一个网站&#xff08;目标&#xff09; 前端开发 最终还是属于 Web 开发 中的一个分支&#xff0c;想要成为一名合格的前端开发人员&#xff0c;就必须要 充分理解Web 的概念。 构建一个专业的网站是一项巨大的工作&#xff01;对于新手我们应该从小事做起&#…

LeetCode 2233. K 次增加后的最大乘积(优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个非负整数数组 nums 和一个整数 k 。每次操作&#xff0c;你可以选择 nums 中 任一 元素并将它 增加 1 。 请你返回 至多 k 次操作后&#xff0c;能得到的 nums的 最大乘积 。由于答案可能很大&#xff0c;请你将答案对 10^9 7 取余后…

Packet Tracer 5.0 建构 CCNA 实验攻略——配置单区域 OSPF

一、拓扑结构如下&#xff1a; 二、分别为PC0、PC1配置IP地址&#xff0c;子网掩码和默认网关。 三、分别为路由器0、路由器1和路由器2各个接口配置IP地址和子网掩码&#xff0c;并将路由器的开关打开。 注意&#xff1a;可以通过命令show ip route 来查看路由表信息 路由器1和…

NSBundle

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle. 1、获取bundle (NSBundle *)mainBundle; //app的目录 NSBundle *file [NSBundle mainBundle]; NSLog(&…

Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信

一、网络拓扑结构如下&#xff1a; 二、为六台PC分别配置IP地址、子网掩码和默认网关 其余五台PC的配置与上图类似。 三、为路由器0创建g0/0.1逻辑子接口和g0/0.2逻辑子接口&#xff0c;并 设置g0/0.1逻辑子接口可以接受VLAN id 为10的802.1q帧&#xff0c;并且可将IP数据报封…