[MySQL事务一文搞懂]

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

[MySQL事务一文搞懂]

1、什么是事务?

事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部执行,要么全部不执行。

2、为什么需要事务

把一系列sql放入一个事务中有两个目的:
  • 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
    """
    当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
    
    但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统失败,甚至是存储介质失败等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。
    """
    

3、事务的四大特性(ACID)

ACID 即Atomicity、Consistency、Isolation、Durability的缩写

1、原子性(Atomicity)
一个事务的执行是整体性的,不可分割,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
2、一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。例如转账行为中:一个人减了50元,另 外一个人就应该加上这50元,而不能 是40元。其他一致状态的含义是数据库中的数据应满足完整性约束, 例如字段约束不能为负数,事务执行完毕后的该字段也同样不是负数
3、隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行, 且多个事务不能看到对方的中间状态(提交或者回滚之前的状态)
4、持久性(Durability)
一个事务的提交,对数据库的修改是永久保存在数据库中的,不受外部因素或其他操作影响。

4、事务的隔离级别

注意:  下方表格即代表 每个隔离级别是否存在并发事务所导致的问题!文章来源地址https://www.toymoban.com/news/detail-447931.html

隔离级别 脏读 不可重复读 幻读
Read uncommitted 读未提交
Read committed 读已提交 ×
Repeatable Read (MySQL默认隔离级别) 可重复读 × ×
Serializable 串行化 × × ×

5、并发事务导致的问题!

注意:下列问题其实就是由于并发事务可能会出现的问题(可用提高数据库隔离级别解决 下面会详解)
  1. 脏读(dirty read)

    """
    脏读其实就是 事务A 读取到了 事务B 未提交的数据!
    
    比如:
    	事务A 查询账户金额为200
    	在此期间 事务B 将当前账户存入100 但是并未提交事务(事务只有再提交后才生效)
    	接下来 事务A 又查询了当前账户金额 发现为300!
    	事务B 并未提交数据 而 事务A 则读取到事务B未提交后的数据!
    	
    解决:
    	将数据库隔离级别修改为: Read committed
    """
    
  2. 不可重复读(non repeatable read)

    """
    不可重复读其实就是 事务A 执行相同的Sql却读取到了不同的数据!
    (和脏读不同的是 它读取到的是已经提交过的事务数据)
    
    比如:
    	事务A 查询账户金额为 200
        事务B 修改金额为300 并且提交事务
        然后 事务A 又查询了账户金额发现为 300 
        这样就导致了 事务A 再同一次事务中执行同样的Sql而获取到不同的值!
    
    解决:
    	将数据库隔离级别修改为: Repeatable Read
    """
    
  3. 幻读(phantom read)

    """
    幻读其实就是事务A再查询某条数据发现并不存在!但是再插入数据的时候却发生ERROR说当前数据已经存在
    (其实这是再不可重复读解决后发生的下一个问题)
    
    比如:
    	事务A 查询 ID=3 的数据没有!
    	此时 事务B 启动 执行插入了 id=3的一条数据
    	然后 事务A 发现ID为3的数据 并没有 也插入了一条 id=3的数据后报错说 已经存在!
    	这是因为 我们的数据隔离级别已经是可重复的 所以事务A 每次查询到的都是最初未改变的状态!
    
    解决:
    	将数据库隔离级别修改为: Serializable
    	
    """
    

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

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

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

相关文章

  • mysql处理json格式的字段,一文搞懂mysql解析json数据

    略。自行百度。 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 MySQL 8.0版本中增加了对JSON类型的索引支持。可以使用CREATE INDEX语句创建JSON类型的索引,提高JSON类型数据的查询效率。 存储JSON文档所需的空间与存储

    2024年02月07日
    浏览(35)
  • 【MySQL】一文带你彻底了解事务机制

    我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题: 数据库中途突然因为某些原因挂掉了。 客户端突然因为网络原因连接不上数据库了。 并发访问数据库时,多个线程同时写入数据库,覆盖了彼此的更改

    2024年02月09日
    浏览(28)
  • 【MySQL】一文带你了解数据库索引与事务

    数据库索引是一种提高数据库查询效率的数据结构。它可以快速地定位和访问数据库中的数据,从而大大提高数据库查询的速度和效率。数据库索引可以根据不同的查询需求构造多个索引,以最大化提高查询效率。 数据库索引基于各种字段来创建,在查询时可以通过索引直接

    2024年02月09日
    浏览(30)
  • 一文带你了解MySQL之事务隔离级别和MVCC

    为了我们学习的顺利进行,我们这边创建一张 hero 表 这里需要注意的是,我们的 hero 表的主键是 number ,而不是 id ,主要是后边要用到的 事务id 做一下区别,然后我们给这个表里插入一条数据 现在我们表里的数据就是这样: 我们知道 MySQL 是 CS 架构的软件,若干个客户端与

    2024年02月08日
    浏览(55)
  • 【从删库到跑路】一文带你明白MySQL数据库的 事务 操作

    🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 建议大家先看目录 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作

    2024年02月13日
    浏览(30)
  • 一文搞懂KMP算法!!!

    KMP算法是一种改进的 字符串匹配算法 ,由 D.E. K nuth , J.H. M orris 和 V.R. P ratt 提出的,因此人们称它为 克努特—莫里斯—普拉特 操作(简称 KMP 算法)。 KMP 算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 具体实现就是通过一

    2024年02月07日
    浏览(33)
  • 一文搞懂containerd

    在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为这里面牵涉到的组件实战是有点多,有很多我们会经常听到,但是不清楚这些组件到底是干什么用的,比如 libcontainer 、 runc 、 containerd 、 CRI 、 OCI 等等。 从 Docker 1.11 版本开始,Docker 容器运行就不

    2024年02月11日
    浏览(28)
  • 一文搞懂Nginx(上)

    是一个高性能的HTTP和反向代理web服务器,我们常用的功能有HTTP代理、负载均衡、动静分离、高可用集群,目前阶段我使用得比较多是就是代理和负载均衡,官方数据测试表明能够支持高达 50,000 个并发连接数的响应。占用的内存也特别的少。 优点: 1、负载均衡(可以减轻单

    2024年04月09日
    浏览(31)
  • 一文搞懂性能测试

    我们经常看到的性能测试概念,有人或称之为性能策略,或称之为性能方法,或称之为性能场景分类,大概可以看到性能测试、负载测试、压力测试、强度测试等一堆专有名词的解释。 针对这些概念,我不知道你看到的时候会不会像我的感觉一样:乱!一个小小的性能测试,

    2024年02月08日
    浏览(46)
  • 一文搞懂隐私计算

    隐私计算(Privacy computing)是指在保证数据不对外泄露的前提下,由两个或多个参与方联合完成数据分析计算相关技术的统称。 隐私计算作为跨学科技术,以密码学为核心理论, 结合了大数据、人工智能、区块链等多领域知识。其这些技术路线中,以安全多方计算为代表的基

    2024年02月07日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包