首页 > 数据库 >MySQL中的事务基础

MySQL中的事务基础

时间:2023-08-20 11:02:06浏览次数:52  
标签:事务 隔离 Read 基础 Session 提交 MySQL 级别

事务的ACID特性

MySQL中的事务指的是在数据库操作中,将一组SQL语句作为一个不可分割的执行单元进行处理的机制。事务具有原子性、一致性、隔离性和持久性的特性(ACID特性)。

MySQL中的事务基础_隔离级别

原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务执行过程中发生错误或中断,系统会撤销已经执行的操作,将数据恢复到事务开始前的状态。


一致性(Consistency):事务操作前后,数据库必须保持一致性状态。这意味着事务的执行不会破坏数据库的完整性约束,例如唯一性约束、外键约束等。


隔离性(Isolation):多个事务并发执行时,每个事务的执行应该与其他事务的执行相互隔离,使得每个事务感觉自己在独立地操作数据。这样可以防止并发事务之间的数据干扰和不一致的读取问题。


持久性(Durability):一旦事务提交,其所做的修改将永久保存在数据库中,即使发生系统故障或数据库崩溃等情况,数据也不会丢失。


要使用事务,首先需要以开始事务的方式将一组相关的SQL语句括起来,通常使用START TRANSACTION、BEGIN或BEGIN WORK语句来开始一个事务。然后,在执行期间,可以执行插入、更新、删除等操作。最后,通过执行COMMIT将事务的结果提交给数据库,或者通过执行ROLLBACK来撤销事务中的所有操作。

START TRANSACTION;


INSERT INTO table1 (column1, column2) VALUES ('value1', 'value2');

UPDATE table2 SET column3 = 'value3' WHERE column4 = 'value4';


COMMIT;

通过START TRANSACTION开始了一个事务,然后执行了一系列的插入和更新操作,最后通过COMMIT提交事务,使得这些操作永久生效。如果在事务执行过程中发生错误,可以使用ROLLBACK回滚事务,撤销之前的操作,使得数据库恢复到事务开始前的状态。


事务提供了一种强大的机制,用于处理复杂的数据库操作,并确保数据的一致性和完整性。


事务的隔离级别

数据并发问题

脏写( Dirty Write )

对于两个事务 Session A、Session B,如果事务Session A 修改了另一个未提交事务Session B 修改过的数

据,那就意味着发生了脏写


脏读( Dirty Read )

对于两个事务 Session A、Session B,Session A 读取了已经被 Session B 更新但还没有被提交的字段。

之后若 Session B 回滚,Session A 读取的内容就是临时且无效的。

Session A和Session B各开启了一个事务,Session B中的事务先将studentno列为1的记录的name列更新

为’张三’,然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的值为’张三’,而

Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据,这种现象

就称之为脏读。


不可重复读( Non-Repeatable Read )

对于两个事务Session A、Session B,Session A 读取了一个字段,然后 Session B 更新了该字段。 之后

Session A 再次读取同一个字段, 值就不同了。那就意味着发生了不可重复读。

我们在Session B中提交了几个隐式事务(注意是隐式事务,意味着语句结束事务就提交了),这些事务

都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可以查看

到最新的值,这种现象也被称之为不可重复读。


幻读( Phantom )

对于两个事务Session A、Session B, Session A 从一个表中读取了一个字段, 然后 Session B 在该表中插

入了一些新的行。 之后, 如果 Session A 再次读取同一个表, 就会多出几行。那就意味着发生了幻读。

Session A中的事务先根据条件 studentno > 0这个条件查询表student,得到了name列值为’张三’的记录;

之后Session B中提交了一个隐式事务,该事务向表student中插入了一条新记录;之后Session A中的事务

再根据相同的条件 studentno > 0查询表student,得到的结果集中包含Session B中的事务新插入的那条记

录,这种现象也被称之为幻读。我们把新插入的那些记录称之为幻影记录。


事务的隔离级别

事务的隔离级别是指多个并发事务之间相互隔离的程度,它定义了一个事务对于另一个事务的可见性和影响。


在MySQL中,有四种标准的隔离级别,每种级别都有不同的特性和性能开销。可以使用以下命令设置隔离级别:

SET TRANSACTION ISOLATION LEVEL <isolation_level>;

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


读未提交(Read Uncommitted):最低的隔离级别。一个事务可以读取另一个事务尚未提交的未提交数据,可能导致脏读(Dirty Read)的问题。该级别具有最好的并发性能,但最低的数据一致性。


读已提交(Read Committed):默认的隔离级别。一个事务只能读取另一个事务已经提交的数据,避免了脏读问题。但是可能会遇到不可重复读(Non-repeatable Read)和幻读(Phantom Read)问题。


可重复读(Repeatable Read):在一个事务执行期间,同样的查询将始终返回相同的结果集。这种级别避免了脏读和不可重复读问题,但是可能会遇到幻读问题。MySQL的默认隔离级别是可重复读。


串行化(Serializable):最高的隔离级别。每个事务依次执行,避免了脏读、不可重复读和幻读的问题。但是串行化级别的并发性能最差,因为它阻止了并发访问。


隔离级别的选择需要根据具体的业务需求和并发性能要求进行权衡。较低的隔离级别具有更好的性能,但可能导致数据不一致的问题;而较高的隔离级别可以提供更强的数据一致性,但可能会降低并发性能。


需要注意的是,更高的隔离级别通常伴随着更大的锁开销和资源竞争,可能导致死锁的发生。因此,在选择隔离级别时,需要综合考虑业务需求、数据一致性要求和系统性能等因素。

标签:事务,隔离,Read,基础,Session,提交,MySQL,级别
From: https://blog.51cto.com/u_16102274/7159374

相关文章

  • TiDB dumpling 导出MySQL 数据遇异常
    最近在学习研究TiDB数据库运维,据介绍逻辑导出工具dumpling是可以兼容MySQL数据库的,于是进行了测试数据库版本信息如下: 新建了两张表t1,t2: 利用存储过程批量插入500000行记录:dropPROCEDUREp_load2;delimiter$$createPROCEDUREp_load2(INtbnamevarchar(64),IN......
  • # yyds干货盘点 # Pandas实战——灵活使用pandas基础知识轻松处理不规则数据
    大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个pandas数据合并处理的问题,一起来看看吧。他的原始数据如下所示:然后预期的结果如下所示:二、实现过程这里【瑜亮老师】给了一个指导如下:原始数据中包含所有所需的信息,但是因为源系统导出的格式问题,有些数据被分配到......
  • PHP查询MySQL 数据库后返回中文为问号
    面向对象1$conn=newmysqli($servername,$user,$password);3增加$conn->query("setnamesutf8");$pdo=newPDO("mysql:host=$servername",$username,$password);增加$pdo->query("setnamesutf8");  面向过程$conn=mysql......
  • java基础
    变量是指一个包含值的存储地址以及对应的符号名称!!变量的名字和变量的值变量就是存储数据的载体类变量使用static关键字修饰,是静态变量static修饰符告诉编译器,无论类被实例化多少次,类变量始终只有一个变量副本。只要类被加载到内存中,它就会存在实例变量也被称为非静态......
  • 01 简介、基础语法
    一、Python简介1、简介Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年设计,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言。2021年10月,语言流行指数的编译......
  • 快速傅里叶变换(FFT)基础
    本文是对FFT和NTT原理及实现的介绍,包含所有必要的证明.阅读本文需要具备一点基本的代数知识.给定\(n\)次多项式\(F(x)\)和\(m\)次多项式\(G(x)\),现在要求它们的卷积\(H(x)=F(x)G(x)\).朴素的暴力实现复杂度为\(O(nm)\),而FFT或NTT可以(在一定的精度范围内或模意......
  • OSPF基础
    链路状态路由协议网络拓扑是如何组成的?由设备和设备之间的链路组成网络拓扑。链路状态是什么?链路状态用来描述网络之间的拓扑结构,具体包括:1.路由器自身的标识2.链路上的邻居3.与邻居相连的接口地址4.与邻居相连的链路开销5.设备自身相连的路由信息6.链路的类型以下是......
  • JAVAEE基础知识
    JAVAEE基础知识2018年3月,开源组织Eclipse基金会宣布,JavaEE(EnterpriseEdition)被更名为JakartaEE,也就是9版本后改名JakartaEE,也就是JakartaEE9。JavaEE(JavaPlatform,EnterpriseEdition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本。这个版本以前称为J2EE......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......