首页 > 数据库 >MySQL事务管理详解:特性、问题与解决方案

MySQL事务管理详解:特性、问题与解决方案

时间:2024-07-22 10:27:44浏览次数:15  
标签:事务管理 事务 20 读取 数据库 并发 死锁 详解 MySQL

什么是事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的四大特性

原子性(Atomicity)

原子性意味着事务中对数据库的一系列操作要么全部成功,要么全部失败,不可能出现部分成功或部分失败的情况。以转账为例,一个账户的余额减少,另一个账户的余额增加,这两个操作必须同时成功或同时失败。如果前一个操作成功了,而后一个操作失败,则必须回滚以确保原子性。原子性在InnoDB中是通过undo log来实现的,它记录了数据修改之前的值,以便在异常发生时通过undo log进行回滚操作。

一致性(Consistency)

一致性指的是事务执行前后数据库的状态必须是合法的,数据库的完整性约束没有被破坏。除了数据库自身的完整性约束,还包括用户自定义的完整性约束。例如,主键必须唯一,字段长度必须符合要求。在转账场景中,如果A账户减少1000元而B账户只增加500元,即使操作成功,也不满足一致性,因为导致了会计科目不平衡。

隔离性(Isolation)

隔离性确保多个事务并发执行时,一个事务的执行不应影响其他事务。不同事务对同一数据的并发操作应该是相互隔离的,透明的,互不干扰。隔离性通过多版本并发控制(MVCC)和锁机制来实现。

持久性(Durability)

持久性保证了事务一旦提交,其对数据库的修改将永久保存在数据库中,即使系统发生崩溃也不会丢失。持久性通过redo log实现,数据修改会先写入内存的缓冲池,并记录在redo log中,即使系统崩溃也能通过redo log恢复数据。

事务并发带来的问题

当多个事务并发操作数据库时,会产生脏读、不可重复读和幻读等问题。

脏读

一个事务读取了另一个事务未提交的修改数据,可能导致读取的数据不一致或不准确。

不可重复读

一个事务内多次读取同一数据,在这个事务未结束时,另一个事务修改了该数据,导致前后读取结果不一致。

幻读

一个事务读取某一范围的数据时,另一个事务在该范围插入新数据,导致前后读取的结果不一致,出现“幻觉”。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT into user VALUES (1,'1',20),(5,'5',20),(15,'15',30),(20,'20',30);

假设有如下业务场景:

时间事务1事务2
begin;
T1select * from user where age = 20;2个结果
T2insert into user values(25,‘25’,20);commit;
T3select * from user where age =20;2个结果
T4update user set name=‘00’ where age =20;此时看到影响的行数为3
T5select * from user where age =20;三个结果

隔离级别

隔离级别是事务并发控制的等级,描述事务之间的隔离程度。SQL标准定义了四个隔离级别:

隔离级别脏读不可重复读幻读
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××

READ-UNCOMMITTED(读取未提交):允许读取未提交的数据,可能会出现脏读。

READ-COMMITTED(读取已提交):只能读取已提交的数据,可能会出现不可重复读。

REPEATABLE-READ(可重复读):保证多次读取同一数据的一致性,但可能会出现幻读。

SERIALIZABLE(可串行化):最高隔离级别,完全隔离,防止脏读、不可重复读和幻读。

解决读一致性问题

LBCC(基于锁的并发控制)

通过锁定操作的数据行,确保事务读取的数据一致性。这种方式可能导致性能下降,因为阻止了并发读写操作。

MVCC(多版本并发控制)

通过保存数据的多个版本,实现事务之间的并发控制,确保读一致性,同时提高并发性能。

InnoDB中的锁

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
在这里插入图片描述

共享锁

允许事务读取数据,多个事务可以共享一个读锁。使用SELECT ... LOCK IN SHARE MODE语句手工加锁。

排它锁

用于修改数据,事务获取排它锁后,其他事务不能再获取该行的共享锁和排它锁。使用FOR UPDATE语句手工加锁。

意向锁

数据库自动维护,用于标识表中的某些数据行被加锁。

记录锁

锁定记录行所在的索引。

间隙锁

锁定索引记录之间的间隙,用于防止幻读。

临键锁

记录锁和间隙锁的组合,锁定索引记录及其前后的间隙。

死锁及其解决方案

死锁是指两个或多个事务相互等待对方释放锁,从而无法继续执行的现象。解决死锁的方法包括:

  1. 按照相同顺序访问表,减少死锁概率。
  2. 尽可能在事务中一次锁定所有资源。
  3. 对容易产生死锁的部分,尝试使用表锁。
  4. 优化索引,减少死锁可能性。

可以参考以下文章了解更多死锁分析和解决方案:

死锁分析与解决1

死锁分析与解决2

标签:事务管理,事务,20,读取,数据库,并发,死锁,详解,MySQL
From: https://blog.csdn.net/qq_26893655/article/details/140544554

相关文章

  • MySQL体系结构与查询执行流程详解
    MySQL体系结构与查询执行过程详解MySQL是一个采用单进程多线程架构模式的关系型数据库管理系统。本文将详细介绍MySQL的体系结构及其查询语句的执行过程,并探讨性能优化的关键点。MySQL体系结构MySQL的架构为Client-Server架构。总体上,我们可以将MySQL的体系结......
  • MySQL 数据导出导入 脚本定时执行
    crontab安装yuminstall-ycrontab定时执行#添加定时任务crontab-e#编辑文件:每天早上6点执行06***sh/data1/mysql/backup/restore.sh#查看定时任务crontab-l全量导出脚本#!/bin/bashdata_dir="/data1/mysql/backup"if[!-d$data_dir];thenmkdi......
  • mysql-connector不会导入到pycharm中的脚本中
    我已经使用pip成功安装了mysql-connector。Installingcollectedpackages:mysql-connectorRunningsetup.pyinstallformysql-connector...doneSuccessfullyinstalledmysql-connector-2.1.6但是,在PyCharm中,当我有一个使用以下行的脚本时:importmysql-conn......
  • Python解释器详解及其应用场景
    Python解释器及其应用场景一、Python解释器概述Python解释器是Python程序运行的核心,它负责读取Python代码(即.py文件)并将其转换为机器语言,从而使计算机能够执行。简单来说,Python解释器就像是Python代码与计算机之间的翻译官,把Python代码翻译成计算机能懂的语言。Python解释器......
  • Mysql之一次完成的sql执行过程
    Mysql一次完成的sql执行过程是什么1、客户端请求客户端通过MySQL协议发送SQL查询或事务到服务器。2、连接处理MySQL服务器为每个客户端连接创建一个线程,该线程处理来自客户端的所有请求。3、SQL解析服务器首先解析SQL语句,检查语法正确性。4、查询优化解析器生成一个或多个......
  • Python网络数据可视化全攻略【方法与技巧详解】
    ......
  • Java基本语法篇 [2](运算符与键盘输入流程详解)
    ......
  • 计算机Java项目|基于SpringBoot的高校办公室行政事务管理系统
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与......
  • MySQL入门学习-SQL高级技巧.透视表
        在MySQL中,虽然没有直接提供像Excel中那样的透视表功能,但可以通过一些技巧来实现类似的效果。通常,我们可以使用聚合函数和'GROUPBY' 子句来创建数据的透视表。一、透视表的概念:    透视表是一种数据汇总和分析的工具,它可以将数据按照不同的维度进行......
  • MySQL入门学习-SQL高级技巧.Window Function
        在MySQL中,窗口函数(WindowFunction)是一种强大的分析工具,它可以在查询结果的基础上进行更复杂的计算和分析。一、窗口函数的概念:    窗口函数可以对查询结果的每一行数据,根据指定的分区(Partition)和排序规则(Order)进行计算。它可以在同一查询中同时返回基础......