【MySQL】一文搞懂 MySQL 中的事务

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



【MySQL】一文搞懂 MySQL 中的事务

0. 前提概要

谈事务,一般就是说数据库事务。本篇文章以 MySQL 为例谈一谈事务。

MySQL 的 Indndb 引擎和 bdb 引擎支持事务。MySQL 的myisam ,memory 等存储引擎是不支持事务的。

自 MySQL5.5之后,默认的存储引擎是Innodb。


1. 什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

比如说我给你2块钱,你给我个外婆菜包子。这两个动作的执行结果是一致的,要么都成功,要么都失败。

不能说我给了你两块钱,你给我包子的动作却执行失败了,那这两个动作就不满足事务(那我早点吃什么~)。


2. 事务的四大特性

事务具体四大特性,也就是经常说的ACID ,常用的MySQL、SqlServer、Orancle都具备这四大特性。

  1. 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作用;
  2. ⼀致性(Consistency): 执行事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;
  3. 隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务之间数据是独立的;
  4. 持久性(Durability): ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
MySQL 中的 ACID 实现原理:
原子性:undolog(记录事务开始前的老版本数据,可以保证原子操作,回滚,实现MVCC版本链)
隔离性:读写锁 、MVCC
持久性:redo log(记录事务开启后对数据的修改,可用于crash-safe)


3. 并发存在的问题

  1. 脏读:读到未提交的数
  2. 不可重复读:一个事务下,两次读取数据不一致(侧重内容数据的修改)
  3. 幻读:事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读(侧重新增或删除,插入数据读到多了一行)
不可重复读:破坏了一致性,update 和 delete
幻读:破坏了一致性 insert

不可重复读和幻读的区别
● 不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些记录的值被修改;
● 幻读的重点在于记录新增比如多次执行同一条查询语句(DQL)时,发现查到的记录增加了。
幻读其实可以看作是不可重复读的一种特殊情况,
单独把区分幻读的原因主要是解决幻读和不可重复读的方案不一样。

举个例子:执行 delete 和 update 操作的时候,可以直接对记录加锁,保证事务安全。
而执行 insert 操作的时候,由于记录锁(Record Lock)只能锁住已经存在的记录,为了避免插入新记录,
需要依赖间隙锁(Gap Lock)。
也就是说执行 insert 操作的时候需要依赖 Next-Key Lock(Record Lock+Gap Lock) 
进行加锁来保证不出现幻读。


4. SQL 标准定义的事务隔离级别

隔离级别原理及解决问题分析:

  1. 读未提交:原理:直接读取数据,不能解决任何并发问题

  2. 读已提交:读操作不加锁,写操作加排他锁,解决了脏读。原理:利用MVCC实现,每一句语句执行前都会生成Read View(一致性视图)

  3. 可重复读:MVCC实现,只有事务开始时会创建Read View,之后事务里的其他查询都用这个Read View。解决了脏读、不可重复读,快照读(普通查询,读取历史数据)使用MVCC解决了幻读,当前读(读取最新提交数据)通过间隙锁解决幻读(lock in share mode、for update、update、detete、insert),间隙锁在可重复读下才生效。(默认隔离级别)

  4. 可串行化:原理:使用锁,读加共享锁,写加排他锁,串行执行

总结:
读已提交和可重复读实现原理就是MVCC Read View不同的生成时机。
可重复读只在事务开始时生成一个Read View,之后都用的这个;读已提交每次执行前都会生成Read View。

MySQL 在 InnoDB下是默认可重复读的隔离级别,加上 MVCC机制 解决了脏读、不可重复读、幻读的问题。



5. SpringBoot 解决事务

5.1 编程式事务

Spring 提供一个接口(PlatfromTransactionManager) 代表事务管理器,为不同框架提供了不同的实现类。

【MySQL】一文搞懂 MySQL 中的事务

Mybatis 框架 事务的实现类是 DataSourceTransactonManager 

使用案例

@Autowired
private TransactionDefinition transactionDefinition;
@Autowired
private DataSourceTransactionManager transactionManager;

//  开启事务
TransactionStatus transactionStatus
        = transactionManager.getTransaction(transactionDefinition);

try {
    //	业务操作
    // ...
    //  提交事务
    transactionManager.commit(transactionStatus);
} catch (Exception e) {
    //  回滚事务
    transactionManager.rollback(transactionStatus);
    log.error("...");
}


5.2 声明式事务

Spring 需要手动开启事务, SpringBoot 默认开启了 不用手动开启。
具体方法上加事务注解就行了。但是 注意事务失效情况。



【MySQL】一文搞懂 MySQL 中的事务文章来源地址https://www.toymoban.com/news/detail-487051.html

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

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

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

相关文章

  • 一文搞懂Java中的容器(集合类)

    提示:本文介绍的集合类有很多,有的是日常开发常用的,有的是面试常问的,建议大家都了解一点。 Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示: 这里有个面试点:Collection 和 Collections 有什么区别? Collection 是一个集合接口 Collections 是一个包装类,

    2024年02月09日
    浏览(44)
  • 【史上最全】MySQL各种锁详解:一文搞懂MySQL的各种锁

    前言 锁在 MySQL 中是非常重要的一部分,锁对 MySQL 的数据访问并发有着举足轻重的影响。锁涉及到的知识篇幅也很多,所以要啃完并消化到自己的肚子里,是需要静下心好好反反复复几遍地细细品味。本文是对锁的一个大概的整理,一些相关深入的细节,还是需要找到相关书

    2024年02月06日
    浏览(40)
  • 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)
  • Linux | 一文带你真正搞懂Linux中的权限问题

    首先来说说权限的基本概念: a.限制人的 b.访问的对象天然可能没有这种“属性” 首先这么说吧,权限也可以理解成【一件事情是否允许被谁“做”】,这个“谁”在Linux中分为两种用户,我么吧下面马上说到 然后要明确权限包括什么: 权限 = 人 + 事物(文件)属性(rwx)

    2024年02月02日
    浏览(37)
  • 一文搞懂idea中的根目录和路径(以Mybatis为例)

    项目根目录是你在文件系统中为整个项目选择的顶层目录。 它通常包含了项目的所有内容,包括源代码、构建配置文件、文档、测试文件等。 在版本控制系统中(如 Git),项目根目录通常是仓库的根目录。 在 IntelliJ IDEA 或其他 JetBrains IDE 中,内容根目录指的是一个模块(

    2024年03月21日
    浏览(28)
  • 【C++漂流记】一文搞懂类与对象中的对象特征

    在C++中,类与对象是面向对象编程的基本概念。类是一种抽象的数据类型,用于描述对象的属性和行为。而对象则是类的实例,具体化了类的属性和行为。本文将介绍C++中类与对象的对象特征,并重点讨论了对象的引用。 相关链接: 一文搞懂类与对象的封装 一文搞懂C++中的

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

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

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

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

    2024年02月09日
    浏览(30)
  • 【Spring进阶系列丨最终篇】一文详解Spring中的事务控制

    本篇文章是【Spring进阶系列】专栏的最后一篇文章,至此,我们对Spring的学习就告一段落,接下来我会持续更新【 Spring+SpringMVC+MyBatis整合 】专栏,欢迎免费订阅! 事务需要放在业务层(service) Spring的事务是基于AOP的 Spring的事务控制有两种:编程式事务【了解】和 声明式事务

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

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

    2024年02月08日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包