mysql的锁

本文详细介绍了MySQL中的不同存储引擎所采用的锁机制,包括MyISAM、MEMORY和InnoDB存储引擎的特点。对于InnoDB存储引擎,文章深入探讨了其支持的表级锁和行级锁机制,以及如何通过SQL语句实现共享锁和排他锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在MySQL中,不同的存储引擎采用的不同的锁机制,如MyISAM和MEMORY存储引擎采用表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁。

MySQL中使用表锁的语句如下:

lock table table_name read;共享读锁,会阻塞写

lock table table_name write;独占写锁,会阻塞读

unlock  tables;释放锁

在MyISAM中执行select和update,insert,delete操作时,系统会自动给表加上相应的锁

lock table时,需要一次锁定sql中用到的所有表,而且如果sql使用了表别名,则需要对别名也都加锁,如:

select a.first_name,b.last_name from user a,user b where a.id=b.id;需要如下的锁定方式:

lock table user as a read,user as b read;

InnoDB的表锁也是同样,下面说说InnoDB的行级锁。

InnoDB实现了两种类型的行锁:

共享锁:允许一个事务去读一行,阻止其他事务获得相同数据行的排他锁

排他锁:允许获得该锁的事务更新数据,阻止其他事务获得相同数据行的排他锁和共享锁

以下是mysql中加以上两种锁的sql语句:

select .....in share mode;共享锁

select .....for update;排他锁

另外说说InnoDB的行锁实现方式,InnoDB是通过给索引上的索引项加锁来实现,这一点和Oracle是不同的,所以只有使用索引的操作InnoDB才会使用行级锁,否则InnoDB就使用表锁。而且如果两个sql同时如果刚好用到的是同样的索引键,也会发生阻塞,另外因为一个表中可能有多个索引,如果一个操作通过某个索引锁定了数据集,另外一个操作要通过另外的索引来锁定同样的数据集,那么也会发生阻塞。

因此,在操作前,最好通过explain查看一下sql的执行计划,看操作是否使用的索引。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/165278/viewspace-441972/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/165278/viewspace-441972/

期末大作业基于python的足球运动员数据分析源码+数据集(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于pyth
### MySQL 机制及类型详解 #### 一、的概念及其作用 MySQL 提供了多种机制来处理并发操作问题,这些能够有效地防止多个事务在同一时间修改相同的数据而导致的数据不一致性[^1]。 #### 二、的分类 根据的作用范围和粒度大小,MySQL主要分为以下三种: 1. **全局** 全局是对整个数据库实例加的一种方式。当启用全局时,所有表都将处于只读状态,无法执行任何更新或删除操作。这种通常用于备份或其他需要完全阻止写入的操作场景中[^2]。 2. **表级** 表级是针对单个表实施的定策略。它会阻止单个表上的某些特定操作直到当前持有该的过程释放为止。相比全局更加精细一些,但仍可能影响到同一时刻对该表的所有访问请求[^4]。 3. **行级** 行级是最细粒度级别的形式之一,在支持此功能存储引擎(如InnoDB)里实现最为典型。通过仅定受影响的具体记录而不是整个表格,它可以最大限度减少因等待资源而产生的延迟现象[^3]。 #### 三、具体应用场景下的SQL语句示例 对于需要显式获取排他的情况,可以采用如下语法结构: ```sql SELECT * FROM table_name WHERE id = 1 FOR UPDATE; ``` 这条命令会在查询过程中自动给符合条件的结果集施加X(X表示exclusive),从而确保其它尝试更改这些行的行为会被挂起直至本事务结束并提交或者回滚变化之前都不能成功运行相应指令。 另外需要注意的是,默认情况下像`SELECT`这样的简单检索并不会附加任何形式的约束条件;然而诸如`UPDATE`, `DELETE`, 或者涉及结构调整的动作则不然——它们均隐含着相应的独占权限需求以便顺利完成各自预定目标的同时维护整体逻辑连贯性不受干扰。 --- ### 性能优化建议 为了缓解由不当使用所引发的各种瓶颈状况,可以从以下几个方面着手改进方案设计思路: - 尽量缩短每个单独事物持续周期长度; - 减少不必要的大范围扫描动作频率; - 合理规划索引体系架构以加速定位速度进而降低竞争概率; - 考虑引入乐观控制方法论代替传统悲观模式等等措施都有助于提升系统的响应效率和服务质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值