MySQL- SELECT ... FOR UPDATE语句

基本介绍

SELECT ... FOR UPDATE 是 SQL 语言中的一种语句,用于在数据库事务处理中控制并发访问。这种语句通常用在需要对数据库中的记录进行更新操作的场景中。下面是对 SELECT ... FOR UPDATE 的详细介绍:

  1. 用途SELECT ... FOR UPDATE 用于锁定一条或多条记录以进行更新。当我们使用这个语句时,数据库会对选定的行加上排他锁(exclusive lock)。这意味着,在当前事务提交或回滚之前,其他事务不能对这些行进行修改或加锁。

  2. 事务中使用SELECT ... FOR UPDATE 通常在事务(transaction)中使用。这是因为,锁定的行只有在事务结束时才会释放。如果不在事务中使用,锁定可能会立即释放,这样就不会有预期的效果。

  3. 锁定行为:当执行 SELECT ... FOR UPDATE 时,数据库会检查要查询的行是否已经被另一个事务锁定。如果这些行已经被锁定,当前事务会等待直到锁释放,除非设置了超时。

  4. 与其他锁的区别:不同于 SELECT 语句的共享锁(shared lock),SELECT ... FOR UPDATE 加的是排他锁。这意味着,其他任何尝试读取或修改这些行的事务都必须等待。

  5. 适用场景:这种语句适用于需要确保读取的数据在事务过程中不被其他事务更改的场景。例如,在转账操作中,我们可能需要读取账户余额,并在事务结束前保证这个余额不会被其他事务更改。

  6. 数据库兼容性:大多数现代的关系数据库系统(如 MySQL、PostgreSQL、Oracle 等)都支持 SELECT ... FOR UPDATE 语句,但具体的实现和行为可能会有所不同。

  7. 注意事项:过度使用 SELECT ... FOR UPDATE 可能会导致数据库性能问题,因为它会阻止其他事务访问被锁定的行。因此,应当小心使用,只在必要时才锁定行。

在实际应用中,需要根据自己的数据库系统和应用场景来恰当地使用这个语句的方式。

示例

下面是一个简单的银行转账场景示例。

假设我们有一个名为 accounts 的数据库表,它包含了账户的信息,包括账户 ID (account_id) 和账户余额 (balance)。我们的目标是从一个账户向另一个账户转账。

以下是转账操作的步骤,使用了 SELECT ... FOR UPDATE 来确保在转账过程中账户的余额不会被其他事务更改:

  1. 开始事务

    START TRANSACTION;
    
  2. 锁定源账户
    假设我们要从账户 123 转账到账户 456。首先,我们需要锁定账户 123 的余额。

    SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
    
  3. 检查余额
    在应用程序中,检查账户 123 的余额是否足够进行转账。

  4. 扣减源账户余额
    如果余额足够,从账户 123 中扣除转账金额。

    UPDATE accounts SET balance = balance - [转账金额] WHERE account_id = 123;
    
  5. 增加目标账户余额
    将相同的金额加到账户 456 的余额上。

    UPDATE accounts SET balance = balance + [转账金额] WHERE account_id = 456;
    
  6. 提交事务
    如果所有操作都成功了,提交事务。

    COMMIT;
    

在这个例子中,SELECT ... FOR UPDATE 语句确保了在整个转账过程中,其他事务无法更改账户 123 的余额。这是非常重要的,因为它防止了在转账过程中余额发生变化,从而可能导致例如余额不足但转账仍然发生的问题。


MySQL中的事务相关命令

在 MySQL 中,事务是用来管理多个操作,使它们要么全部成功,要么全部失败的一种机制。以下是 MySQL 中常用的与事务相关的命令:

  1. START TRANSACTIONBEGIN
    这两个命令用于启动一个新的事务。START TRANSACTION 提供了更多的选项,但在大多数情况下,BEGINSTART TRANSACTION 是等价的。

    START TRANSACTION;
    
  2. COMMIT
    当我们完成了所有的操作并且想要将更改永久保存到数据库中时,使用 COMMIT 命令。一旦提交,所有在事务中做的更改都将成为数据库的一部分。

    COMMIT;
    
  3. ROLLBACK
    如果在事务中出现错误或者我们想撤销事务中所做的更改,可以使用 ROLLBACK 命令。这将撤销自事务开始以来所做的所有更改。

    ROLLBACK;
    
  4. SAVEPOINT
    SAVEPOINT 命令允许在事务中设置一个保存点,我们可以在必要时回滚到这个点,而不是回滚整个事务。

    SAVEPOINT savepoint_name;
    
  5. ROLLBACK TO SAVEPOINT
    使用这个命令可以回滚到之前设置的特定保存点。

    ROLLBACK TO SAVEPOINT savepoint_name;
    
  6. RELEASE SAVEPOINT
    这个命令用于删除一个保存点。一旦保存点被释放,就不能再回滚到这个点了。

    RELEASE SAVEPOINT savepoint_name;
    
  7. SET TRANSACTION
    这个命令用于设置事务的特定特性,如隔离级别。

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    

使用事务时,重要的是要了解数据库隔离级别,因为它决定了不同事务之间可见性和可能发生的并发问题(如脏读、不可重复读、幻读)。

注意,要使事务正常工作,MySQL 表需要支持事务。InnoDB 引擎支持事务,而 MyISAM 引擎则不支持。因此,确保我们的表是使用 InnoDB 引擎创建的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧食堂餐卡充值文件生成器使用说明

智慧食堂餐卡充值文件生成器 下载地址: https://download.csdn.net/download/boysoft2002/88646277 或者百度网盘下载: https://pan.baidu.com/s/16cxOa5aq0CU0T0xOr2A7-A 操作使用说明 一、文件结构 下载.rar文件后,释放到非系统盘符的…

解决mp4视频无法拖动进度条的问题

现象: 海康威视的监控摄像头保存的视频,,mp4格式, 大小1G。用PotPlayer播放器进行播放, 不拖动进度条的话可以正常播放, 但拖动进度条后, 视频无法正常播放, 在 PotPlayer 中的表现就是只有进度条在走&…

TensorFlow(2):Windows安装TensorFlow

1 安装python环境 这一步请自行安装,这边不做介绍。 2 安装anaconda 下载路径:Index of /,用户自行选择自己的需要的版本。 3 环境配置 3.1 anaconda环境配置 找到设置,点击系统->系统信息->高级系统设置->环境变量…

ThinkPad E550c

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

基于YOLOv5的吸烟检测系统设计与实现

一、项目背景 吸烟检测作为保障公共健康和环境安全的重要任务之一,一直备受关注。传统的吸烟检测方法往往依赖人工判断,存在准确性低和实时性差的问题。为了解决这些问题,本项目基于深度学习技术进行了吸烟检测系统的设计与实现,…

buuctf-Misc 题目解答分解91-93

91.[SUCTF2018]followme 下载完就是一个流量包 ,用wireshark 打开 直接导出 http对象 这里面 有很多的这样的文件 里面都是参数 直接搜索 关键字 suctf grep -r "SUCTF" 得到flag SUCTF{password_is_not_weak} 92.[MRCTF2020]CyberPunk 用notepad 打开…

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(5-检索开发)

系列文章目录 本系列课程主要针对于Ehcache缓存框架功能的开发实践全流程技术指南! 第一节:Ehcache缓存框架的基本概念和简介第二节:Ehcache缓存框架的配置分析和说明第三节:Ehcache缓存框架的缓存方式的探索第四节:E…

隐藏通信隧道技术——防御SSH隧道攻击的思路

隐藏通信隧道技术——防御SSH隧道攻击的思路 ​ 在内网中建立一个稳定、可靠的数据通道,对渗透测试工作来说具有重要的意义。应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。常用的隧道协议有SSH、HTTP/HTTPS和DNS。 SSH协议 在一般情况下&#xff…

PostgresSQL数据库中分区和分表的区别以及PostgresSQL创建表分区分表示例

1.分区分表理解 数据库分区和分表都是数据库中常用的数据分散存储技术,但它们的实现方式和应用场景有所不同。 分表:将一个大的表拆分成多个小的表,每个子表存储一部分数据。分表可以减轻单个表的数据量,提高查询效率&#xff0c…

计算机组成原理(复习题)

更多复习详情请见屌丝笔记 一、选择题 计算机系统概述 1、至今为止,计算机中的所有信息仍以二进制方式表示的理由是( C )。 A.运算速度快 B.信息处理方便 C.物理器件性能所致 D.节约元件 2、运算器的核心功能部件是( D &am…

HarmonyOS应用开发者高级认证满分指南

声明:由于HarmonyOS应用开发者高级认证的题库一直在变,所以文章中的题目直做参考。 1. 判断题 云函数打包完成后,需要到APPGallery Connect创建对应函数的触发器才可以在端侧中调用。 【错】每一个自定义组件都有自己的生命周期。 【对】基…

【离散数学】——期末刷题题库(树其二)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

Flink SQL填坑记2:Flink和MySQL的Bigdata类型不同导致ClassCastException报错

最近在开发Flink SQL的时候,需要关联Kafka事实表和MySQL维表,得到的数据写入Phoenix表中,但是其中有个字段,Kafka表、MySQL表和Phoenix表都是BigData类型,但是在实现的时候却报“java.math.BigInteger cannot be cast to java.lang.Long”异常,从报错信息来看,是由于Big…

[CVPR-23] PointAvatar: Deformable Point-based Head Avatars from Videos

[paper | code | proj] 本文的形变方法被成为:Forward DeformationPointAvatar基于点云表征动态场景。目标是根据给定的一段单目相机视频,重建目标的数字人,并且数字人可驱动;通过标定空间(canonical space&#xff09…

http -- 跨域问题详解(浏览器)

参考链接 参考链接 1. 跨域报错示例 Access to XMLHttpRequest at http://127.0.0.1:3000/ from origin http://localhost:3000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header…

【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

问题:修改合并单元格的内容 修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现 方案:Delegate class EditDelegate : public QStyledItemDelegate {public:EditDelegate(QTableView *view): tableView(view){}pu…

JS基础之模块化

JS基础之模块化 JS模块化模块化前端发展 什么是模块?怎么定义模块化IIFE匿名函数自调用IIFE模式增强模块化的好处 JS模块化 模块化 JS DOM操作 代码规范管理的标准 不同模块间的管理模块内部自组织 标准bundler (模块构建工具) ESNext TS -> ES5 前端发展 生态 …

Python数据处理必备:Pandas DataFrame中行迭代技巧大曝光!

更多资料获取 📚 个人网站:ipengtao.com 在数据分析和处理中,Pandas是Python中最常用的库之一,而DataFrame是Pandas的核心数据结构之一。迭代DataFrame中的行是一种常见的操作,本文将详细介绍几种迭代DataFrame行的方…

android —— PopupWindow

一、常用方法: 1、设置显示的位置 // 一个参数 popupWindow.showAsDropDown(v); //参数1: popupWindow关联的view // 参数2和3:相对于关联控件的偏移量popupWindow.showAsDropDown(View anchor, int xoff, int yoff)2、是否会获取焦点 popupWindow.se…

k8s集群内部署nexus

一、前言 在k8s集群中部署nexus服务需要使用到pv、pvc服务来存储nexus的数据,需要使用service服务来提供对外访问nexus服务的端口,需要使用deployment服务来管理nexus服务,接下来就是用这些服务来在k8s集群中搭建nexus,pv服务使用…