【MySQL事务】保证数据完整性的利器

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

1、事务的认识

事务:事务就是将多个SQL给打包在一起,组成一个整体。组成这个整体的各个SQL,要么全部成功,要么全部失败。

举例说明:

情人节到了,滑稽老铁打算给他女朋友小美发给红包,但是他又害怕小美不收,于是他想到了一个办法就是通过银行卡进行转账。他给小美转账了 520 元,那么滑稽老铁的银行卡余额就得 -520 元,小美的银行卡余额 +520 元。这些操作就组成一个整体,就变成了事务,要么执行,要么就一个都不执行。

【MySQL事务】保证数据完整性的利器

如果中间出错了,就一条都不执行。这里的一条都不执行,并不是真的一条都不执行,而是自动的恢复成执行之前的样子了,看起来就好像一个都没有执行一样,这个操作就称为“回滚(rollback)”。

回滚:回滚就是把执行过的操作逆向恢复回去,就像电脑上的 ctrl + z 操作

数据库会把执行的每个操作都记录下来,如果某个操作出错了,就会把事务中前面的操作进行回滚,然后根据之前进行的操作,进行逆操作

这些操作是会有很大开销的,可以保存但不能无限保存,最多就是把正在执行的事务保存下来,额外的东西不好再保存了

2、事务的特性

2.1事务的四大特性

  • 原子性:打包成整体这个操作,就称为“原子性”,这个是事务最核心的特性

举例说明:滑稽老铁给小美转账 520 元,此时滑稽老铁余额 - 520 元,小美余额 +520,此时把转账、滑稽老铁余额 - 520 元,小美余额 +520元 打包成一个整体,要么都执行,要么一个都不执行,这就具有了原子性。

  • 一致性:事务执行前/执行后,都得是数据合法的状态

举例说明:滑稽老铁给小美转账520元,如果转账成功滑稽老铁余额-520元,小美余额+520元。如果转账失败滑稽老铁余额不扣钱,小美余额也不加钱。

注:一致性是根据原子性而来的,要么全部执行,要么都不执行

  • 持久性:事务产生的修改,都会写入硬盘

举例说明:滑稽老铁给小美转账 520 元,转账成功滑稽老铁余额-520元,小美余额+520元,这个是持久的,不会改变的。

  • 隔离性:一个数据库服务器,同时执行多个事务的时候,事务之间的“相互影响程度”

举例说明:当多个事务同时执行的时候,一个事务的执行是否会干扰到其他事务,这就是事务的隔离性

2.2 隔离性的重点说明

MySQL 服务器,是要同时给多个客户端提供服务,此时多个客户端之间就可能会同时发生事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就可能引起一些麻烦

  • 如果隔离性越高,也就意味着事务之间的并发程度越低,执行效率越慢,但数据的准确性越高

  • 如果隔离性越低,也就意味着事务之间的并发程度越高,执行效率越快,但数据的准确性越低

2.3 事务同时执行会出现的问题

2.3.1 脏读

脏读:当事务A在写数据的时候,事务B读取事务A写的数据,事务B 读完后,事务A改了数据,那么此刻事务B读到的数据就是错误的数据,这就称为“脏读”问题。

举例说明:张三和李四是同桌,有一次老师布置课堂作业的时候,李四第二题不会写,于是李四就偷偷的看了一眼张三写的,看到张三第二题选了A,

在这个场景下,滑稽老铁和小美这两个事务是完全并发的没有任何限制,在这个前提下就会出现脏读问题

问题:如何解决脏读问题?

答:解决脏读问题就是降低并发性、提高隔离性,可以给这里的 "写操作" 进行加锁

加锁:当进行了写加锁,滑稽老铁在制定表白计划表的期间,别人就不能同时去读了。相当于降低了并发程度,提高了隔离性,降低了一定的效率,但是提高了准备性

2.3.1 脏读

脏读:当事务A在写数据的时候,事务B读取事务A写的数据,事务B 读完后,事务A改了数据,那么此刻事务B读到的数据就是错误的数据,这就称为“脏读”问题。

举例说明:张三在写作业,作业内容 123+32 = 15.. 当张三写完 15 之后,李四跑过来瞄了一眼张三的答案:123+32=15,于是李四就把这个答案抄到自己的作业本上了,但是实际上张三要写的是 123+32 = 155,但是李四读到了一个张三还没写完的答案,也就导致李四读到了一个错误的数据,这就是脏读问题

如何解决脏读问题呢?

答:降低并发性、提高隔离性,也就是给“写操作”加锁

加锁可以分为:写加锁和读加锁

写加锁:写的时候,别人不能进行读

读加锁:读的时候,别人不能进行写

2.3.2 不可重复读

不可重复读:事务B 在读的时候,事务A改了数据,此刻事务B连续两次读到的数据结果不一样

举例说明:张三在写作业的时候,发生李四一直在瞄。张三感觉李四有点影响到他了,于是就跟李四约定,等张三写完了再给李四瞄。过了一会张三写完了,李四就开始瞄了,当李四正在瞄的时候,张三发现自己有个地方错了,就李四等一会再瞄,自己先改一下,这就导致李四之前瞄到的数据和现在瞄到的数据可能不一样

如何解决不可重复读呢?

答:给读加锁,让李四读的时候,张三不能修改。

这两个事务之间的并发程度进一步降低了,隔离性又进一步提高了,运算速度又进一步变慢了,数据的准确性又进一步提高了

2.3.3 幻读

幻读:事务A写的时候,事务B不能读;事务B读的时候,事务A不能写。虽然事务A不能写,但是事务A可以新增和删除一个其他的文件,此刻事务B 两次读到的结果集就不同了

李四正在瞄的时候,张三让他等一下在喵,自己先改一下。李四感觉自己正在瞄的时候,张三总是打断自己,于是就跟张三商量说,你写的时候我不去瞄,我瞄的时候你也不能让我等一下你去改。于是张三就跟李四约定好了,张三写的时候李四不能读,李四读的时候张三不能写。李四在瞄的时候,张三没事干,张三就看哪里写错了,发现写错了自己又不能在李四读的时候去改,然后就把正确答案写到另一种本子上,写完后把正确答案在拿出来,李四一看怎么又多了本子,这就是幻读问题

如何解决幻读问题?

答:串行化,彻底的舍弃并发。就是当事务B读的时候,事务A什么都不能干

3、MySQL提供的隔离级别

MySQL 为了解决并发执行带来的问题,提供了四个隔离级别

  • read uncommitted:不做任何限制,事务之间都是随意并发执行的。并发程度最高,隔离性最低。会产生: 脏读+不可重复读+幻读

  • read committed:对写操作加锁,并发程度降低了,隔离性提高了。解决了脏读问题,但仍然存在:不可重复读+幻读

  • repeatable read:对写和读都加锁了,并发程度又降低了,隔离性又提高了。解决了脏读和不可重复读问题,但可能存在:幻读

  • serializable:严格串行化,并发程度最低,隔离性最高。解决了脏读+不可重复读+幻读问题,但执行速度最慢文章来源地址https://www.toymoban.com/news/detail-480731.html

到了这里,关于【MySQL事务】保证数据完整性的利器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【MySQL】数据库完整性和安全性

    目录   一、完整性 1.概念 2.sql语言支持的两种约束     2.1静态约束          撤销追加约束          断言     2.3动态约束           触发器 二、安全性 用DBMS对数据库实现的两个特性  1.概念 指dbms保证的db的一种特性,在任何情况下的正确性、有效性、一致性 原理图

    2023年04月24日
    浏览(89)
  • 软件测试|MySQL主键约束详解:保障数据完整性与性能优化

    简介 主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。 MySQL是一种广泛使用的开源关系型数据库管理系统,其支持多种数据约束,其中主键约束是其中最重要的之一

    2024年02月02日
    浏览(48)
  • Mysql列的完整性约束(调整列的完整性约束)

    目录 一、 主键PK、外键FK和 唯一键UK 新增 删除         修改         修改默认值DEFAULT、自增长和非空NK 总结 alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])         1.通过如下命令查询键值的约束名:                 

    2024年02月01日
    浏览(54)
  • 软件测试/测试开发/全日制|MySQL主键约束详解:保障数据完整性与性能优化

    简介 主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。 MySQL是一种广泛使用的开源关系型数据库管理系统,其支持多种数据约束,其中主键约束是其中最重要的之一

    2024年02月19日
    浏览(57)
  • 二级MySQL(四)——完整性约束

    一种规则,限制存储的数据 保证数据库中数据的正确,有效和完整 分类: 非空——得有值——NOT NULL 唯一——唯一的,不重复——UNIQUE 主键——非空且唯一——PRIMARY KEY 默认——给出默认值——DEFAULT 检查——保证某个条件——CHECK 外键——两张表的连接——FOREIGN KEY 主键

    2024年02月11日
    浏览(45)
  • MySQL开发技巧——查询、索引和完整性

     目录 第1关 基本查询的学习 查询语句SELECT 头歌实验 查询语句SELECT 第2关 深入学习查询语句 MySQL聚集函数 头歌实验 MySQL聚集函数 第3关 视图的创建和使用 查看数据库中表的情况: 头歌实验 第4关 索引和完整性 索引 头歌实验 索引 数据完整性 域完整性 实体完整性 参照完整

    2024年02月08日
    浏览(39)
  • Mysql列的完整性约束最详细教程之一——详解

    目录 前言 一、主键约束 1.设置字段的主键约束(PRIMARY KEY,PK) 1.单字段主键 2.多字段主键 二、设置表字段的外键约束 1.简介 2.语句格式 三、设置表字段的非空约束(NOT NULL, NK) 1.简介 2.语句格式 四、设置字段值自动增加(AUTO_INCREMENT)  1.语句格式   2.实际应用 五、设置

    2024年02月04日
    浏览(42)
  • 数据安全—数据完整性校验

    1、数据安全保障三要素即 保密性 完整性、可用性 机密性:要求数据不被他人轻易获取,需要进行数据加密。 完整性:要求数据不被他人随意修改,需要进行签名技术 可用性:要求服务不被他人恶意攻击,需要进行数据校验 2、为保证数据完整性如下图所示 1)将要提交的参

    2024年02月09日
    浏览(51)
  • 2.4数据完整性验证

    1.数据完整性概述 数据完整性指数据不会被非授权更改或破坏,如篡改、删除、插入等 主要类型:带恢复的连接完整性、不带恢复的连接完整性、选择字段连接完整性、无连接完整性、选择字段无连接完整性 主要实现技术:基于密码技术的完整性保护和基于非密码技术的完

    2024年02月08日
    浏览(55)
  • 数据库系统概论—安全、完整性

    数据库的安全性指保护数据库以防 不合法 使用所造成的数据泄露、更改或破坏 2.1用户身份鉴别 静态口令鉴别 动态口令鉴别 生物鉴别特征 智能卡鉴别 2.2存取控制 自主存取控制:给用户限权(DAC,C1级) 强制存取控制:给数据库对象一定的密级(MAC,B1级) 2.3自主存取控制方法(授

    2024年02月03日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包