首页 > 数据库 >MySQL共享锁:使用与实例详解

MySQL共享锁:使用与实例详解

时间:2024-08-19 14:05:48浏览次数:12  
标签:事务 读取 实例 详解 MySQL 共享 数据 id

在关系型数据库的使用中,锁机制是保障数据一致性和完整性的关键工具。尤其在并发环境下,合理使用锁可以有效避免数据冲突与不一致问题。本文将详细介绍MySQL中的共享锁(Shared Lock),并通过实际案例展示其具体应用场景。

1. 什么是共享锁(Shared Lock)?

共享锁,也称为读锁(Read Lock),是MySQL锁机制的一部分。当一个事务对某一行数据加上共享锁时,其他事务仍然可以读取这行数据,但无法对其进行修改。多个事务可以同时持有同一数据行的共享锁,这使得共享锁适用于需要并发读取而无需立即修改数据的场景。

共享锁按照读写属性属于读锁。

共享锁属于悲观锁。

2. 为什么需要共享锁?

在实际应用中,数据的一致性是至关重要的。例如,在金融系统中,读取到的数据必须在整个交易过程中保持一致,而不会因为其他事务的修改而发生变化。这时,使用共享锁可以确保读取到的数据在整个事务中保持不变,从而保证数据的完整性和一致性。

3. 共享锁的使用示例

下面我们通过一个具体的示例,来说明如何在MySQL中使用共享锁。

3.1. 创建示例表并插入数据

首先,我们创建一个简单的用户表,并插入一些初始数据。

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

INSERT INTO users (id, name, email) VALUES
(1, 'Alice', '[email protected]'),
(2, 'Bob', '[email protected]'),
(3, 'Charlie', '[email protected]');
3.2. 在事务中使用共享锁

假设你需要在一个事务中读取某个用户的信息,并确保在事务结束之前,这条记录不会被其他事务修改。你可以使用LOCK IN SHARE MODE来实现这一需求。

sql START TRANSACTION; SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;

通过LOCK IN SHARE MODE,我们对id = 1的行加上了共享锁。此时,其他事务可以读取这行数据,但无法对其进行更新或删除。

3.3. 尝试在另一个事务中修改数据

现在,假设另一个事务尝试修改这条记录。

sql START TRANSACTION; UPDATE users SET name = 'Alice Updated' WHERE id = 1;

由于第一个事务尚未提交或回滚,因此这个更新操作将被阻塞,直到第一个事务完成为止。这确保了在第一个事务期间,读取到的id = 1的数据保持不变。

3.4. 提交第一个事务

完成第一个事务后,可以提交或回滚事务,释放锁。

sql COMMIT;
3.5. 完成第二个事务

第一个事务提交后,第二个事务的更新操作才能顺利执行。

sql COMMIT;

4. 共享锁的典型应用场景

共享锁主要应用于以下场景:

  • 一致性读取:当需要在读取数据后确保该数据在整个事务过程中不被修改时,可以使用共享锁。
  • 长时间读取:在读取操作可能持续较长时间时,使用共享锁可以防止其他事务在读取完成前修改数据。

5. 总结

MySQL的共享锁是一个强大的工具,可以在高并发环境中确保数据的一致性和完整性。通过合理使用共享锁,开发者可以有效防止数据在读取过程中被其他事务修改,保障数据操作的可靠性。在复杂的业务场景中,结合使用共享锁和其他类型的锁,可以实现更为精细化的事务控制。

希望本文对你理解和应用MySQL的共享锁有所帮助。如果你有任何问题或想法,欢迎在评论区讨论。

标签:事务,读取,实例,详解,MySQL,共享,数据,id
From: https://www.cnblogs.com/zhanchenjin/p/18367188

相关文章

  • 简单的php连接mysql类
    <?phpclassDB{private$hostname;//数据库主机private$dbname;//数据库private$username;//数据库用户名private$password;//数据库密码private$port;//数据库端口public$db;//连接后的数据库对象//构造函数publicfunction__......
  • 学懂C++(三十七):深入详解C++网络编程开发
            目录一、网络编程基础概念与原理1.1套接字(Socket)1.2IP地址和端口1.3TCP/IP协议二、C++网络编程核心技术2.1套接字编程2.1.1创建套接字2.1.2绑定地址2.1.3监听和接受连接2.1.4发送和接收数据三、C++网络编程高级技术3.1异步I/O3.2多线......
  • 学懂C++(三十八):深入详解C++网络编程:套接字(Socket)开发技术
    目录一、概述与基础概念1.1套接字(Socket)概念1.2底层原理与网络协议1.2.1网络协议1.2.2套接字工作原理二、C++套接字编程核心技术2.1套接字编程的基本步骤2.2套接字编程详细实现2.2.1创建套接字2.2.2绑定地址2.2.3监听和接受连接(服务端)2.2.4客户端连接2.......
  • MySQL 安装与配置教程:单机、主从复制与集群模式
    目录MySQL简介MySQL安装MySQL基础配置MySQL主从复制配置MySQL集群配置总结1.MySQL简介MySQL是一个广泛使用的关系型数据库管理系统,具有高性能、高可靠性和易用性等特点。它支持多种部署模式,包括单机模式、主从复制模式(用于高可用性和读写分离)以及集群模式(用于分......
  • mysql相关命令学习
    查看mysql服务是否启动service mysql status Windows下通过任务管理器即可查看启动mysql服务service mysql start登录Mysqlmima #查看用户密码可以看到两个用户一个是root一个是admin,然后还有登录密码。启动:mysql -u用户名 -p密码mysql -u用户名......
  • 使用duckdb加载mysql
    安装duckdbhttps://duckdb.org/docs/installation/index加载mysql扩展https://duckdb.org/docs/extensions/mysql.html离线安装的话,可以等INSTALLmysql;超时后,根据它提示的URL到有网环境下载,再传到服务器挂载Nginx,修改/etc/hosts指向,再重新执行INSTALL。Demo代码如下:import......
  • k8s实践——HPA实践实例
    0x01水平自动扩缩HPA指statefulset和deployment这些负载,可以根据系统的负载压力,自动扩容应对业务高峰,并在低峰时自动缩容,降低资源消耗。0x02准备要求已经有一个1.23以上的k8s集群,在其中部署metrics-server。示例用的1.25,运行时为containerd。kubectlapply-fhttps://githu......
  • 全面指南:LLMs中的Llama-3模型——简介、安装教程、使用技巧及案例实践详解
    LLMs之Llama3:Llama-3的简介、安装和使用方法、案例应用之详细攻略导读:2024年4月18日,Meta重磅推出了MetaLlama3,本文章主要介绍了Meta推出的新的开源大语言模型MetaLlama3。模型架构Llama3是一种自回归语言模型,采用了优化的Transformer架构。调优版本使用了监督......
  • MySQL中的char与varchar
    MySQL中的char与varcharchar类型为固定长度的字符串varchar类型是长度可变的字符串char为固定长度的字符串意思是当我们设置一个字段类型为char时,指定char(100),在计算机底层就会分配足够存储这100个字符的空间。那怕我们使用的长度不够100,剩余的空间在存储时将会被填充以空......
  • 软启动详解
    软启动详解软启动(SoftStart)是一种用于电机或电气负载的启动技术,旨在减少启动时的电流冲击和机械应力。通过软启动,设备可以在启动过程中逐渐增加功率,从而实现平滑启动。以下是软启动的详细介绍:软启动的目的减少启动电流:避免因电流过大而损坏电机或电网。减少机械应力:平滑启动......