Day04 04-MySQL的事务(TCL)

这篇具有很好参考价值的文章主要介绍了Day04 04-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-485329.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 04-MySQL的事务(TCL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 小红书笔记无法展示是什么原因?让我们来看看吧

          最近有的小伙伴发现自己的笔记发布后却不被系统展示,不知道是怎么回事,今天就来分析分析小红书笔记无法展示是什么原因,以及笔记内容应该注意些什么。      首先,小红书笔记无法展示是什么原因呢?可能是内容不宜展示,也可能是被判定违规了。 一、在小

    2024年02月05日
    浏览(80)
  • MySql学习笔记08——事务介绍

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

    2024年02月09日
    浏览(38)
  • 选购哪种护眼灯对眼睛好,让我们一起来看看吧

    在日常生活中,护眼灯已经是成为家庭流行使用的照明工具之一,护眼灯对视力是有一定帮助的,会摒弃摁掉一些日常灯具,对眼睛造成伤害的可能性,比如说蓝光,对人们的视力有不可逆的损伤,而护眼灯就过滤掉蓝光危害,还有频闪问题等等,护眼灯投射出来的光,会更

    2023年04月08日
    浏览(39)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

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

    2024年02月09日
    浏览(69)
  • Day04 03-MySQL数据库的DCL(用户|权限|视图)

    第十二章 DCL 12.1 DCL的作用 DCL语句主要用来做用户的创建、管理,权限的授予、撤销等操作的。 12.2 管理用户 创建、删除用户的操作,必须要使用root用户才可以完成! 12.3 权限管理 如果在授权远程登录的时候,出现如下问题: Unable to load authentication plugin ‘caching_sha2_password’

    2024年02月07日
    浏览(58)
  • Google I/O 2023 大会上发布了一些令人兴奋的技术和产品,让我们一起来看看吧!

    Google I/O 2023 大会上发布了一些令人兴奋的技术和产品,让我们一起来看看吧! Google I/O 2023 的日期和地点 Google I/O 2023 于 5 月 10 日在美国加州山景城的海岸线圆形剧场举行12。这是 Google 每年举办的开发者大会,旨在展示 Google 的最新解决方案、产品和技术。今年的大会有限制

    2024年02月04日
    浏览(52)
  • 用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》【第十期】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 网络空间安全体系是建立在先进技术、严密监控和综合策略之上的综合性框架,旨在保护网络免受恶意攻击、数据泄露和网络犯罪的威胁,其核心包括身份认证与访问

    2024年02月05日
    浏览(46)
  • matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

    uintt16位的话会在上面前面加上00,16位的话一定是两个字节,一共16位的数据 如果是unint8的话就不会, 注意这里给的是13,但是现实的00 0D,这是大小端的问题,在matlanb里设置,我们就默认用这个模式吧,没关系的,小端,小段的小数据在前,所以是00 0D。 下图是串口输出P

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

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

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

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

    2024年03月14日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包