锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 数据库
  4. 高并发场景下,MySQL处理并发修改同一行数据的安全方法

高并发场景下,MySQL处理并发修改同一行数据的安全方法

0
  • 数据库
  • 发布于 2024-08-12
  • 2 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

在高并发场景下,MySQL 处理并发修改同一行数据的安全方法主要有以下几种:

  1. 悲观锁(Pessimistic Locking):

    • 使用SELECT ... FOR UPDATE语句,在事务中锁定需要修改的行。这样其他事务在该行被解锁之前无法对其进行修改。 ```sql START TRANSACTION; SELECT * FROM table WHERE id = ? FOR UPDATE;
      • 根据查询结果进行更新操作 UPDATE table SET column = value WHERE id = ?; COMMIT;

        CREATE TABLE my_table (
        id INT PRIMARY KEY,
        data VARCHAR(50),
        version INT DEFAULT 0
        );
        
  2. 乐观锁(Optimistic Locking):

    • 乐观锁不阻止并发访问,而是在更新时检查自上次读取以来数据是否已被修改。实现上通常通过一个额外的版本号字段或时间戳字段来完成。

    • 在 MySQL 中,可以通过在表中增加一个 version 字段,并在更新时判断 version 值是否未变来实现乐观锁。

      START TRANSACTION;
      SELECT stock FROM products WHERE product_id = ? FOR UPDATE;
      -- 检查并计算新的库存值
      UPDATE products SET stock = new_stock WHERE product_id = ?;
      COMMIT;
      

    -- 更新时使用版本号作为条件 UPDATE my_table SET data = 'new_value', version = version + 1 WHERE id = ? AND version = ?;

    UPDATE products 
    SET stock = new_stock, version = version + 1 
    WHERE product_id = ? AND version = current_version;
    
  3. 事务隔离级别调整:

    • 调整数据库事务的隔离级别,例如将隔离级别设置为REPEATABLE READ(InnoDB 默认级别),可以防止脏读和不可重复读,但这并不能完全避免幻读问题,对于解决并发更新问题仍需配合上述锁策略。
  4. 队列处理:

    • 对于极高的并发需求,可以引入消息队列系统,让所有修改请求先进入队列,然后由后台服务按照队列顺序逐个处理,从而避免直接的竞争冲突。
  5. 应用层控制:

    • 在应用程序层面采用分布式锁、Redis 等中间件实现锁机制,或者设计更复杂的业务逻辑,如使用 “预扣库存” 的原子操作减少对数据库行级锁的依赖。

结合实际应用场景和数据库特性选择合适的并发控制策略,才能既保证数据的一致性,又兼顾系统的高性能。

举例子:

熊二:光头强,咱们现在这小卖部的生意火爆得不行,有时候同时好多人下单买同一件商品,你要是用 MySQL 更新库存的时候,万一被别人插队给改了咋整?

光头强:嘿,那不是乱套了吗?我可不想有人空手套白狼把咱的商品都给 “抢” 光了!

熊二:没错!为了避免这种情况,我给你支几招。首先,可以试试悲观锁,就像超市收银台排队结账一样。

光头强:怎么个排法?

熊二:就是在你准备修改库存前,先用SELECT ... FOR UPDATE跟数据库说:“嘿,我要改这个商品的库存,你们其他人先别动,等我改完了再轮到你们。”

START TRANSACTION;
SELECT stock FROM products WHERE product_id = ? FOR UPDATE;
-- 检查并计算新的库存值
UPDATE products SET stock = new_stock WHERE product_id = ?;
COMMIT;

光头强:哦,懂了,就是先占坑再操作。那还有别的招吗?

熊二:当然有,还有一种叫乐观锁,这就像是每件商品都有个 “标签”,每次改库存之前都要看看这个标签有没有变。

光头强:啥标签?

熊二:在数据库里加一个版本号字段,比如version。每次修改时,不仅要更新库存,还要把版本号 + 1。

UPDATE products 
SET stock = new_stock, version = version + 1 
WHERE product_id = ? AND version = current_version;

如果更新失败(受影响行数为 0),那就说明期间有人捷足先登,这时候你就重新获取最新数据,再尝试更新。

光头强:哈哈,这招更像玩捉迷藏,谁动作快谁就赢!

熊二:对啊,各有各的好处,具体选哪一招,就得看咱小卖部的实际需求和性能瓶颈了!

标签: #数据库 67
相关文章

深入理解MySQL InnoDB中的B+索引机制 2024-09-30 14:41

目录 一、InnoDB中的B+ 树索引介绍 二、聚簇索引 (一)使用记录主键值的大小进行排序

mysql中B+树的数据存储 2024-09-29 16:36

B+树索引基础分析 B+树 的定义 B+树是一种自平衡的树形数据结构,常用于数据库和操作系统的索引结构。它具有以下特点: 所有数据都存储在叶子节点,非叶子节点仅存储键值和子节点的指针。 叶子节点之间通过指针相互连接,形成一个有序链表,便于范围查询。 每个节点可以拥有多个键值,键值之间是有序的。 B+

MySQl索引事务(B树) 2024-09-29 16:36

目标: 索引 事务 1.索引 1.1概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 1.2作用 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。 索引所起的作用类似书籍

MySQL数据库的备份与恢复 2024-09-26 17:57

MySQL数据库的备份与恢复 在现代信息时代,数据已成为企业和个人的重要资产,数据的安全性和可恢复性直接影响到业务的连续性和稳定性。MySQL作为广泛使用的关系型数据库管理系统,其数据的备份与恢复显得尤为重要。本文将详细探讨MySQL数据库的备份与恢复策略,包括备份的重要性、备份类型、常用备份方法及

MySQL中创建数据库和表 2024-09-26 17:57

在MySQL中创建数据库和表是数据库管理的基础步骤,它们构成了数据存储和操作的基础结构。下面,我将详细介绍如何在MySQL中创建数据库和表,包括创建数据库的基本语法、设计表的考虑因素、表的创建过程、数据类型和约束的使用等,力求内容详尽且不少于2000字。 一、创建数据库 在MySQL中,数据库是一个

MySQL数据库主从搭建(详细图文) 2024-09-28 15:11

MySQL数据库主从搭建(详细图文) 前言 主从原理: MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以"事件"的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.