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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 0. 前提概要谈事务,一般就是说数据库事务。本篇文章以 MySQL 为例谈一谈事务。MySQL 的 Indndb 引擎和 bdb 引擎支持事务。MySQL 的myisam ,memory 等存储引擎是不支持事务的。

0. 前提概要

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

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

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

1. 什么是事务?

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

比如说我给你2块钱,你给我个外婆菜包子。这两个动作的执行结果是一致的,要么都成功,要么都失败。
不能说我给了你两块钱,你给我包子的动作却执行失败了,那这两个动作就不满足事务(那我早点吃什么~)。

2. 事务的四大特性

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


原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作用;

⼀致性(Consistency): 执行事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是相同的;

隔离性(Isolation): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务之间数据是独立的;

持久性(Durability): ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库

  1. 生故障也不应该对其有任何影响。
MySQL 中的 ACID 实现原理:
原子性:undolog(记录事务开始前的老版本数据,可以保证原子操作,回滚,实现MVCC版本链)
隔离性:读写锁 、MVCC
持久性:redo log(记录事务开启后对数据的修改,可用于crash-safe)

3. 并发存在的问题

脏读:读到未提交的数

不可重复读:一个事务下,两次读取数据不一致(侧重内容数据的修改)

幻读:事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读(侧重新增或删除,插入数据

  1. 读到多了一行)
不可重复读:破坏了一致性,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(一致性视图)

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

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

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

5. SpringBoot 解决事务

5.1 编程式事务

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

1f3df65d68c545998886f33a4290c551.png

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 默认开启了 不用手动开启。

具体方法上加事务注解就行了。但是 注意事务失效情况。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
23天前
|
SQL 安全 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-01
【4月更文挑战第6天】MySQL事务的隔离性确保数据操作的完整性和一致性,ACID原则包括原子性、一致性、隔离性和持久性。事务隔离级别有四种:读未提交、读提交、可重复读和串行化,分别解决并发问题如脏读、不可重复读和幻读。不同隔离级别在效率和安全性间权衡,例如读未提交允许未提交变更可见,而串行化通过锁保证安全但可能降低效率。在不同隔离级别下,事务看到的数据状态会有所变化,例如在可重复读级别,事务始终看到初始数据,而在串行化级别,事务会等待其他事务完成再继续,避免数据冲突。
277 10
|
1天前
|
SQL 安全 关系型数据库
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
|
3天前
|
存储 关系型数据库 MySQL
Mysql学习--深入探究索引和事务的重点要点与考点
Mysql学习--深入探究索引和事务的重点要点与考点
|
4天前
|
存储 SQL 关系型数据库
Mysql_数据库事务
Mysql_数据库事务
|
4天前
|
SQL 关系型数据库 MySQL
MySQL事务与MVCC详解
MySQL事务与MVCC详解
11 0
|
5天前
|
缓存 关系型数据库 MySQL
【专栏】MySQL高可用与性能优化——从索引到事务
【4月更文挑战第27天】本文探讨了提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理。通过合理使用B-Tree和哈希索引,避免过度索引,以及优化查询语句和利用查询缓存,可以改善性能。事务管理中,应减小事务大小并及时提交,以保持系统效率。主从或双主复制可增强高可用性。综合运用这些方法,并根据实际需求调整,是优化MySQL的关键。
|
6天前
|
Java 关系型数据库 MySQL
{MySQL}索引事务和JDBC
{MySQL}索引事务和JDBC
16 0
|
8天前
|
关系型数据库 MySQL Java
MySQL事务理论与实践
MySQL事务理论与实践
15 1
|
8天前
|
存储 SQL 关系型数据库
MySQL 事务
MySQL 事务
13 0