Day04 03-MySQL的事务(TCL)

这篇具有很好参考价值的文章主要介绍了Day04 03-MySQL的事务(TCL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第十三章 TCL

13.1 事务的介绍

我们先来看一个场景:

假如把每一张银行卡的信息存入数据库的表中进行存储,每一张表中存储有银行卡的卡号、余额信息。小明需要给小红转账1000元钱,那么在数据库中需要进行的操作是什么?
	- 将小明的银行卡余额,减1000
	- 将小红的银行卡余额,加1000
	
那么,如果在上述的操作中,如果第一步成功了,小明的余额已经减过了。但是在给小红的银行卡余额增1000的时候出现了问题,导致本次操作失败了。那么本次转账整体失败,小明的余额也需要回滚到减1000之前的状态。

当一个业务需求涉及到多个DML操作时,这个业务(或者多个DML操作)当成一个整体来处理。在处理的过程中,如果有失败或异常,我们要回到业务开始时。如果成功处理,我们再将数据持久化到磁盘中。这样一个过程我们称之为一个事务。事务具有原子性。不可切割。

总结: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全成功,要么全不成功。

13.2 事务的特性
  • 原子性(Atomicity)

    指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    
  • 一致性(Consistency)

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
    
  • 隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    
  • 持久性(Durability)

    指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
    
13.3 MySQL的事务
13.3.1 隐式事务

隐式事务,或者称为自动事务。不需要进行额外的控制,每一条DML语句都是一个事务,可以自动提交。

  • 事务开始于
    • 连接到数据库上,并执行一条DML语句insert、update或delete。
    • 前一个事务结束后,又输入了另一条DML语句。
  • 事务结束于
    • 执行commit或rollback语句。
    • 执行一条DDL语句,例如create table语句,在这种情况下,会自动执行commit语句。
    • 执行一条DCL语句,例如grant语句,在这种情况下,会自动执行commit。
    • 断开与数据库的连接。
    • 执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句。
13.3.2 显式事务
-- 禁用自动提交的功能
set autocommit = 0;

-- 开启一个事务(可以省略不写)
start transaction;

-- 执行一组DML操作
...

-- 设置回滚点
savepoint spName;

-- 结束事务
commit;					-- 提交事务
rollback;				-- 回滚到事务的起点
rollback to spName;		-- 回滚到指定的回滚点
13.4 并发事务
13.4.1 并发事务出现的问题

如果有多个事务,同时操作同一个数据库中的同一个数据的时候,会出现如下的问题:

  • 脏读: 事务A读取了事务B刚刚更新的数据,但是事务B回滚了,这样就导致事务A读取的为脏数据,我们称之为脏读。

    如公司某财务人员更新公司入账报表时,在DML语句中的数字后少添加了一个0,但是未提交。然后吃饭,吃饭回来,发现错误,然后更正后做了提交。而在吃饭期间,老板要求秘书查看一下报表,秘书看到的是少个0的数据。这就是脏读。
    
  • 不可重复读: 事务A读取同一条记录两次,但是在两次之间事务B对该条记录进行了修改并提交,导致事务A两次读取的数据不一致。

    它和脏读的区别是: 脏读是事务A读取了另一个事务B未提交的脏数据,而不可重复读则是事务A读取了事务B提交的数据。
    
    多数情况下,不可重复读并不是问题,因为我们多次查询某个数据时,当然要以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,比如,老板让B和C分别核对事务A操作的数据,结果可能不同,老板是怀疑B呢,还是C呢?
    
  • 幻读: 事务A在修改全表的数据,比如将字段age全部修改为0岁,在未提交时,事务B向表中插入或删除数据,如插入一条age为25
    岁的数据。这样导致事务A读取的数据与需要修改的数据不一致,就和幻觉一样。

    幻读和不可重复读的相同点: 都是针对于另外一个已经提交的事务而言。不同点: 不可重复读是针对于同一条记录来说的 (delete或update同一条记录, 而幻读是针对于一批数据来说的 (insert)。
    
13.4.2 事务的隔离级别

我们知道了多个事务同时对相同的数据进行处理的时候,会出现上述的问题,那么应该怎么去解决这个问题呢?

可以通过设置事务的隔离级别

  • 未提交读(read uncommitted)

    就是不做隔离控制,可以读到 “脏数据“,可能发生不可重复读,也可能出现幻读。
    
  • 提交读(read committed)

    提交读就是不允许读取事务没有提交的数据。显然这种级别可以避免了脏读问题。但是可能发生不可重复读,幻读。这个隔离级别是大多数数据库的默认隔离级别。(除了MySQL)
    
  • 可重复读(repeatable read)

    为了避免提交读级别不可重复读的问题,在事务中对符合条件的记录上"排他锁”,这样其他事务不能对该事务操作的数据进行修改,可避免不可重复读的问题产生。由于只对操作数据进行上锁的操作,所以当其他事务插入或删除数据时,会出现幻读的问题,此种隔离级别为Mysql默认的隔离级别。
    
  • 序列化(Serializable)文章来源地址https://www.toymoban.com/news/detail-469452.html

    在事务中对表上锁,这样在事务结束前,其他事务都不能够对表数据进行操作(包括新增,删除和修改)。这样避免了脏读,不可重复读和幻读,是最安全的隔离级别。但是由于该操作是堵塞的,因此会严重影响性能。
    
避免脏读 避免不可重复读 避免幻读
read uncommitted × × ×
read committed × ×
repeatable read ×
Serializable
-- 查看当前隔离级别
select @@transaction_isolation;
-- 设置当前MysqL连接的级别
set transaction isolation level read committed;
-- 设置数据库系统的全局隔离级别
set global transaction isolation level read committed;
-- 一般需要重启生效

到了这里,关于Day04 03-MySQL的事务(TCL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

    第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 第六章 OpenGL ES 基础-FBO、VBO理解与运用 第七章 OpenGL ES 基础-输入

    2024年04月17日
    浏览(31)
  • MySql学习笔记08——事务介绍

    事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。 一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。 由于只有DML语句中才会有事务的概念,因此事务只和 insert update delete 语句有关。 说到

    2024年02月09日
    浏览(40)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

    目录 前言: 索引简介:  索引结构:           二叉树索引结构         Tree(普通二叉树)         B-Tree(多路平衡查找树)         B+Tree          哈希索引数据结构 总结: 在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引

    2024年02月09日
    浏览(76)
  • 59 openEuler 22.03-LTS 搭建MySQL数据库服务器-软件介绍和配置环境

    59.1 软件介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL是业界最流行的RDBMS (Relational Database Management System,关系数据库管理系统)之一,尤其在WEB应用方面。 关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库

    2023年04月22日
    浏览(55)
  • 第十三章 接口测试(笔记)

    一、接口测试分类     内部接口:测试被测系统各个子模块之间的接口,或者被测系统提供给内部系统使用的接口     外部接口:         1.被测系统调用外部的接口          2.系统对外提供的接口 接口测试重点:检查接口参数传递的正确性,接口功能的正确性,输出结

    2024年02月02日
    浏览(46)
  • HCIP第十三天(笔记)

    STP --- 生成树协议 冗余 线路冗余 设备冗余 网关冗余 UPS冗余 二层环路引发的问题 1.广播风暴 --- 广播帧在二层环路中会形成顺时针和逆时针两重环路,无限循环,最终将导致设备宕机,最终导致网络瘫痪 2.MAC地址表的翻摆(MAC地址表的漂移)---- 因为循环的存在,导致MAC地址

    2024年02月16日
    浏览(41)
  • 第十三单元 补充知识

    泛指某种类型。 1、使用参数形式定义 2、使用时传入具体类型 3、编译时检查类型安全 4、逻辑上是多个不同类型 泛型与非泛型之间的区别 性能高:可以避免装箱和拆箱操作 类型安全 :在进行类型转换的时候不会抛出异常 代码重用:定义一次,用许多种不同类型实例化 代

    2024年02月06日
    浏览(39)
  • 【力扣刷题 | 第十三天】

    今天随机进行练习,题型上不会有什么限制,主要还是练习STL算法。 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并

    2024年02月10日
    浏览(52)
  • 动态规划。第十三次

    2024.2.28 ************************************************************************************************************** 题目链接:P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)  思路:用dfs其实也可以写,不过这道题目会超时。由于题目上说只能往右边还有下面走,所以每一点

    2024年03月14日
    浏览(30)
  • 性能测试工具 IxChariot:Tcl脚本调用方法介绍

    ixChariot是一款功能强大的性能测试软件,可用来测试有线和无线性能,可以模拟真实应用程序流量,并提供关键性能指标,包括吞吐量、丢包、抖动、延迟、MOS等。本文简单介绍如何使用IxChariot Tcl API来实现自动化跑流。 一个基本的IxChariot测试网络主要包括三个部分: IxCha

    2024年02月08日
    浏览(166)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包