MySQL事物

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: MySQL事物

MySQL事物


1、事务概念

  1. 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果,保证事务执行的原子操作
  2. 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上
  3. 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态


2、事物处理命令

#查看MySQL是否自动提交事务
SELECT @@AUTOCOMMIT;#0表示手动提交事务,1表示自动提交事务
#设置事务提交方式为手动提交方式
set autocommit=0;
#开启一个事务
BEGIN;
#提交一个事务
COMMIT; 
#回滚一个事务到初始的位置
ROLLBACK; 
#设置一个名字为point1的保存点
SAVEPOINT point1; 
#事务回滚到保存点point1,而不是回滚到初始状态
ROLLBACK TO point1; 
#设置事务的隔离级别
SET TX_ISOLATION='REPEATABLE-READ'; 
#查询事务的隔离级别
SELECT @@ TX_ISOLATION; 


3、ACID特性

  • 每一个事务必须满足下面的4个特性:
  1. 事务的原子性(Atomic):

事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成

  1. 事务的一致性(Consistency):

一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。

就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务,总体上数据是不变的,保持一致性转态

  1. 事务的隔离性(Isolation):

当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响

  1. 事务的持久性(Durability):

事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性

例如,事物再提交之后,在数据库刷盘过程中,即便因为故障出错,也应该能够恢复数据

  • ACID的底层实现:

ACD依靠的是数据库的redo log和undo log实现的;I是依赖数据库的锁实现的


4、事务并发存在的问题

  • 事务处理不经隔离,并发执行事务时通常会发生以下的问题:
  1. 脏读(Dirty Read):

一个事务读取了另一个事务未提交的数据

例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A尚未提交的数据)

92579d038f22ed90b3e612d744b619ba.png

  1. 不可重复读(NonRepeatable Read):

一个事务的操作导致另一个事务前后两次读取到不同的数据

例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样

f179d1aa27ef97848252be26d3204988.png

  1. 虚读(Phantom Read)幻读:

一个事务的操作导致另一个事务前后两次查询的结果数据量不同

例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了

1ac68f56b655f7696a7e5f9b18d1a91d.png

脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误


5、事务的隔离级别

  • MySQL支持的四种隔离级别是:

1、TRANSACTION_READ_UNCOMMITED

未提交读:说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的

set tx_isolation='READ-UNCOMMITTED';

0a8afe1a2e94762b0d88368bfceffb89.png

2、TRANSACTION_READ_COMMITED

set tx_isolation='READ-COMMITTED';

已提交读:说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生

7faeae3e64fb5c174d4663965c2daaa0.png

3、TRANSACTION_REPEATABLE_READ

可重复读:说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现

set tx_isolation='REPEATABLE-READ';

0e7856008393cea756e852811942eb02.png

  • 说明:

在目前版本中,可重复读在一定程度上可以避免insert/delete幻读,但是无法避免update幻读

4、TRANSACTION_SERIALIZABLE

串行化:是最高的事务级别,它防止读脏数据,不可重复读和虚读。

set tx_isolation='SERIALIZABLE';


c73e4d9cd0890d2fb08fa34bd3674ab7.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
消息中间件 存储 Kafka
RabbitMQ、RocketMQ和Kafka全面对决,谁是最佳选择?
1、应用场景 1.RabbitMQ: 适用于易用性和灵活性要求较高的场景 异步任务处理:RabbitMQ提供可靠的消息传递机制,适用于处理异步任务,例如将耗时的任务放入消息队列中,然后由消费者异步处理,提高系统的响应速度和可伸缩性。 解耦系统组件:通过使用RabbitMQ作为消息中间件,不同的系统组件可以通过消息进行解耦,实现松耦合的架构,提高系统的可维护性和灵活性。 事件驱动架构:RabbitMQ的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。
1319 2
|
索引 存储 NoSQL
表格存储(Tablestore)入门指南
表格存储(Tablestore)入门指南内容简介了表格存储(Tablestore)是阿里云自研的 NoSQL 多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务。
19707 2
|
消息中间件 Java Kafka
消息传递新纪元:探索RabbitMQ、RocketMQ和Kafka的魅力所在
【8月更文挑战第29天】这段内容介绍了在分布式系统中起到异步通信与解耦作用的消息队列,并详细探讨了三种流行的消息队列产品:RabbitMQ、RocketMQ 和 Kafka。其中,RabbitMQ 是一个基于 AMQP 协议的开源消息队列系统,支持多种消息模型;RocketMQ 则是由阿里巴巴开源的具备高性能、高可用性和高可靠性的分布式消息队列,支持事务消息等多种特性;而 Kafka 作为一个由 LinkedIn 开源的分布式流处理平台,以高吞吐量和良好的可扩展性著称。此外,还提供了使用这三种消息队列发送和接收消息的代码示例。总之,这三种消息队列各有优势,适用于不同的业务场景。
191 3
|
10月前
|
消息中间件 大数据 Kafka
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
|
10月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
Kubernetes 固态存储 调度
Kubernetes节点亲和性分配Pod
Kubernetes节点亲和性分配Pod
173 0
Kubernetes节点亲和性分配Pod
|
11月前
|
存储 算法 中间件
每日 3000万订单的社区电商要如何分库分表
文章首先介绍了分库分表的基本概念,包括分库、分表及其组合形式,并详细解释了水平切分、垂直切分和混合切分的方式。接着分析了分库分表的原因,如解决性能瓶颈、微服务化需求等。文章还讨论了分库分表的常见问题,如调试难度、分布式事务和跨库查询等,并介绍了分库分表工具的客户端模式和代理模式。最后,通过一个社区电商的真实案例,详细展示了分库分表的具体落地过程,包括评估库表总数、选择分库分表字段等关键步骤。
359 5
|
12月前
|
Java
java版本详解
java版本详解
|
11月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
消息中间件 固态存储 RocketMQ
RocketMQ消息堆积常见场景与处理方案
文章分析了在使用RocketMQ时消息堆积的常见场景,如消费者注册失败或消费速度慢于生产速度,并提供了相应的处理方案,包括提高消费并行度、批量消费、跳过非重要消息以及优化消费代码业务逻辑等。