首页 > 数据库 >MySQL 事务详解

MySQL 事务详解

时间:2024-10-25 12:46:03浏览次数:10  
标签:事务 隔离 并发 详解 提交 MySQL 一致性 读取

在数据库管理系统中,事务是一个非常重要的概念,MySQL 也不例外。本文将详细介绍 MySQL 中的事务,包括事务的定义、四大特性、提交与回滚代码样例、并发问题以及隔离等级等方面的内容。

一、事务定义

事务是一个逻辑工作单元,它是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行,以确保数据库的一致性和完整性。例如,在一个银行转账系统中,从一个账户扣款并向另一个账户存款,这两个操作必须作为一个事务来执行,要么都成功,要么都失败,以保证账户余额的正确性。

二、事务的四大特性(ACID)

1. 原子性(Atomicity)

原子性确保事务中的所有操作要么全部执行成功,要么全部回滚到事务开始之前的状态。就像一个原子,不可分割。例如,在一个购物网站上,用户下单时需要同时更新库存、生成订单记录和扣除用户余额等操作。这些操作必须一起成功完成,否则任何一个操作失败都要将整个事务回滚,保证数据的一致性,不会出现库存减少了但订单没生成或者余额扣除了但库存没更新的情况。

2. 一致性(Consistency)

一致性要求事务在执行前后,数据库必须从一个合法的状态转换到另一个合法的状态。例如,在一个库存管理系统中,事务开始前库存数量为 100,执行一个事务将 50 件商品出库,那么事务结束后库存数量应该变为 50,数据库的完整性约束(如主键约束、外键约束等)不能被破坏,始终保持数据的正确性和合法性。

3. 隔离性(Isolation)

隔离性指的是多个事务并发执行时,它们之间相互隔离,互不干扰。每个事务都感觉不到其他事务在同时进行,就好像每个事务都在独立的数据库环境中执行一样。例如,一个用户在查询自己的账户余额时,不应该看到其他用户正在进行的转账操作对余额的中间状态影响,而只能看到事务开始前的初始余额或者事务成功提交后的最终余额。

4. 持久性(Durability)

持久性意味着一旦事务成功提交,它对数据库所做的更改就会永久保存下来,即使系统发生故障也不会丢失。例如,在一个电商系统中,用户成功下单并支付后,订单信息和支付记录会被持久化保存到数据库中,不会因为服务器突然断电或者系统崩溃而丢失这些数据。

三、在 MySQL 中,事务提交与回滚代码样例

1. 事务提交示例

-- 开启事务
START TRANSACTION;

-- 执行一系列数据库操作
INSERT INTO users (name, age) VALUES ('John', 30);
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO transactions (amount, user_id) VALUES (100, 1);

-- 提交事务
COMMIT;

在上述代码中,首先使用 START TRANSACTION 开启一个事务,然后执行了插入用户信息、更新账户余额和插入交易记录等操作。最后,如果所有操作都成功执行,使用 COMMIT 提交事务,将这些操作对数据库的更改永久保存。

2. 事务回滚示例

-- 开启事务
START TRANSACTION;

-- 执行一系列数据库操作
INSERT INTO users (name, age) VALUES ('Tom', 25);
-- 假设这里出现了某种错误,比如违反了唯一性约束
UPDATE accounts SET balance = balance + 200 WHERE user_id = 2; 

-- 回滚事务
ROLLBACK;

在这个示例中,在执行插入用户信息后,更新账户余额时可能由于某种原因(如违反约束)导致操作失败。此时,使用 ROLLBACK 回滚事务,将数据库恢复到事务开始之前的状态,就好像这些操作从未执行过一样。

四、事务的并发问题

在多用户并发访问数据库的情况下,可能会出现以下事务并发问题:

1. 脏读

脏读是指一个事务读取到了另一个事务未提交的数据。例如,事务 A 修改了一条记录但还未提交,此时事务 B 读取了这条记录。如果事务 A 后来回滚了操作,那么事务 B 读取到的数据就是无效的,也就是“脏”数据。

2. 不可重复读

不可重复读是指在一个事务中多次读取同一数据集合,但是在这个过程中,另一个事务对该数据集合进行了修改,导致前后两次读取的结果不一致。例如,事务 A 读取了一条记录,然后事务 B 更新了这条记录并提交。接着事务 A 再次读取这条记录时,发现数据与第一次读取的不同,这种情况就叫做不可重复读。

3. 幻读

幻读是指一个事务在执行查询操作时,按照某个条件查询到了一些记录。然后另一个事务在该表中插入了一些符合该条件的新记录,并且提交了事务。当第一个事务再次按照相同条件查询时,会发现多了一些之前没有查询到的记录,就好像出现了“幻觉”一样。

五、事务的隔离等级

为了解决事务并发问题,MySQL 提供了四种隔离等级:

1. 读未提交(Read Uncommitted)

在这个隔离级别下,事务可以读取到其他事务未提交的数据,这会导致脏读问题。它的隔离性最低,但并发性最高,因为它对事务之间的隔离限制最少。在一些对数据一致性要求不高,且更注重并发性能的场景中可能会使用,但一般情况下不建议使用,因为脏读可能会导致数据的不一致性和错误的结果。

2. 读已提交(Read Committed)

读已提交隔离级别下,一个事务只能读取到其他事务已经提交的数据,解决了脏读问题。但是,它仍然可能会出现不可重复读的情况。例如,事务 A 在读取一条记录后,事务 B 对该记录进行了修改并提交,当事务 A 再次读取该记录时,会得到不同的结果。大多数数据库系统的默认隔离级别都是读已提交,它在保证一定数据一致性的同时,也提供了较好的并发性能。

3. 可重复读(Repeatable Read)

可重复读是 MySQL 的默认隔离级别。在这个级别下,事务在执行期间多次读取同一数据集合时,会得到相同的结果,解决了不可重复读问题。但是,它可能会出现幻读现象。例如,事务 A 按照某个条件查询到了一些记录,然后事务 B 插入了一些符合该条件的新记录并提交,当事务 A 再次按照相同条件查询时,会发现多了一些记录。为了解决幻读问题,MySQL 在可重复读隔离级别下通过多版本并发控制(MVCC)和间隙锁等机制来实现。

4. 串行化(Serializable)

串行化是最高的隔离级别,它通过强制事务串行执行,完全避免了事务并发问题,即脏读、不可重复读和幻读都不会出现。但是,这种隔离级别会严重影响数据库的并发性能,因为它相当于对事务进行了顺序执行,只有一个事务执行完后,另一个事务才能开始执行。在实际应用中,只有在对数据一致性要求非常高,且并发量较小的场景下才会考虑使用串行化隔离级别。

六、隔离级别与一致性的关系

不同的隔离级别对事务的一致性有着不同的影响。

读未提交隔离级别由于可能出现脏读,导致数据的一致性无法得到保证。一个事务读取到了其他未提交事务的“脏”数据,如果这些数据最终被回滚,那么就会产生不一致的结果。

读已提交隔离级别解决了脏读问题,保证了数据不会被读取到未提交的无效状态,从而在一定程度上提高了数据的一致性。但是,不可重复读的存在可能会使得在同一个事务中对同一数据的多次读取结果不一致,对于某些需要严格一致性的业务场景来说,这可能还是不够的。

可重复读隔离级别通过 MVCC 等机制解决了不可重复读问题,进一步增强了数据的一致性。在大多数情况下,能够满足业务对数据一致性的要求。然而,幻读问题的存在可能在一些特殊场景下影响数据的一致性,比如在需要精确统计符合某个条件的记录数量时。

串行化隔离级别完全避免了事务并发问题,提供了最强的一致性保证。但是,它是以牺牲并发性能为代价的。在实际应用中,需要根据业务的具体需求来权衡选择合适的隔离级别,以在保证数据一致性的前提下,尽可能提高数据库的并发处理能力。

总之,MySQL 中的事务是保证数据库数据一致性和完整性的重要机制。了解事务的四大特性、并发问题以及隔离等级等相关知识,对于正确使用和管理数据库至关重要。在开发应用程序时,需要根据实际业务场景合理选择事务隔离级别,以达到数据一致性和系统性能的最佳平衡。

标签:事务,隔离,并发,详解,提交,MySQL,一致性,读取
From: https://blog.csdn.net/dawn191228/article/details/143231349

相关文章

  • 【MySQL】实战篇—项目需求分析:如何进行需求分析与数据库设计
    在软件开发中,数据库是应用程序的核心组成部分。一个良好的数据库设计能够提高系统的性能、可维护性和扩展性。因此,进行需求分析与数据库设计是开发过程中的重要环节。通过合理的设计,可以确保数据的完整性、一致性和安全性。需求分析的定义需求分析是指在软件开发过程中,收集、......
  • 【MySQL】实战篇—项目需求分析:ER图的绘制与关系模型设计
    在软件开发中,数据库是信息系统的核心部分,合理的数据库设计能够显著提高系统的性能和可维护性。ER图(实体-关系图)是数据库设计的重要工具,它通过图形化的方式描述了数据实体及其相互关系,帮助开发者和设计者更好地理解数据结构和业务逻辑。ER图的定义ER图是一种用于表示数据模型......
  • 【MySQL】实战篇—数据库设计与实现:根据需求设计数据库架构
    在设计数据库架构时,开发者需要遵循一系列步骤,以确保数据库能够高效、可靠地满足系统需求。以下是设计数据库架构的理论知识和步骤说明。1.需求分析需求分析是数据库设计的第一步,旨在理解系统的功能需求和数据需求。通过与利益相关者(如用户、开发人员和业务分析师)进行沟通,明......
  • 【小学奥数】小学数学几何模型详解
    小学数学几何模型综合解析一、蝴蝶模型(一)定义在梯形中,通过两条对角线将梯形分成四个部分,这四个部分的面积之间存在特定的比例关系,形似蝴蝶。(二)证明思路由于梯形上下底平行,所以△A......
  • Linux基础——虚机mysql库覆盖/usr/lib64/libcrypto.so.1.1.1f无法启动
    1、问题描述租户新增数据库mysql,手动覆盖/usr/lib64中的libcrypto.so.1.1.1f库文件,导致主机重启进入救援模式。 2、问题分析i.发现报错poweroff:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:Nosuchfileordirectoryii.检......
  • 一文彻底弄懂MySQL的各个存储引擎,InnoDB、MyISAM、Memory、CSV、Archive、Merge、Fede
    MySQL中的存储引擎是其数据库管理系统的核心模块,用于处理不同类型的数据存储和检索操作。每种存储引擎都有自己的特点,适用于不同类型的应用场景。MySQL最常用的存储引擎包括InnoDB、MyISAM、Memory、CSV、Archive、Merge、Federated、NDB等。以下是对MySQL存储引擎的详细介......
  • 《无人深空》风灵月影修改器优化步骤与操作手册详解
    《无人深空》(NoMan'sSky)是一款非常受欢迎的科幻探索游戏。使用修改器如风灵月影可以帮助玩家获得更好的游戏体验,比如通过修改来获取无限资源、快速旅行等。但请注意,在使用任何第三方工具之前,请确保了解相关的风险,包括但不限于账号被封禁的风险。风灵月影修改器使用步骤:1.......
  • Keepalived+Mysql实现高可用配置总结
    通过本文,大家将学习到以下相关知识内容:1、什么是高可用服务2、Keepalived简介3、Keepalived常见应用场景4、Keepalived高可用故障切换原理介绍5、VRRP协议介绍6、配置实现Keepalived监控Mysql7、Keepalived配置文件介绍8、Keepalived常见问题列举一、什么是高可用服务......
  • 宝塔安装mysql5.6提示内存不足1g
    增加内存:购买或升级服务器配置,确保至少1GB以上的内存。尝试在设置中增加分配给该虚拟机的内存。优化MySQL配置:编辑MySQL的配置文件(通常位于/etc/my.cnf或/etc/mysql/my.cnf)。减少MySQL的内存使用,例如调整以下参数:[mysqld]innodb_buffer_pool_size=128Mkey_buf......
  • windows中mysql遇到的一些小问题
    windows中mysql的一些常见问题初始化时指定defaults-files配置文件初始化失败#windows中使用cmd操作mysql时注意cmd命令自带的编码格式是gbk编码,所以在cmd下操作mysql命令可能回出现问题,例如:初始化mysqld--initialize--defaults-file="配置文件"时遇到系统库初始化失败的情......