mysql锁

 

表锁、行锁

表锁:偏向于myisam 锁的粒度大,速度快,开销小,无死锁,发生锁冲突频率高
myisam 偏读
lock table table_name read/write //锁表 读锁和写锁
unlock table_name //解锁
show open tables; //查看状态, in_use = 0 表示正常

读锁、写锁

读锁共享
写锁排他

读锁

session1

session2

获取读锁
lock table table_name read
 
可以读该表
不可以读其他的没有加锁的表(报错)
可以读该表,可以读其他的表
不可以插入和更新该表(报错)不可以修改该表(阻塞),seesion1进行unlock后完成修改
不可以修改或其他的表(报错)可以修改或更新其他未锁定的表

 

写锁

session1

session2

获取写锁
lock table table_name write
 
可以对锁定的表正常的读写操作,其他session对锁定的表查询更新阻塞,需要等待释放锁
不可以查其他未锁定的表 

读锁会阻塞写,不会阻塞读;写锁会把读和写都阻塞

行锁


偏向innodb存储引擎,开销大,加锁慢,会出现死锁,锁的粒度最小,发生锁冲突的概率最小
innodb与myisom的区别:1.支持事务;2.采用了行级锁。

事务

事务是由一组sql语句组成的逻辑处理单元,有一下4个属性,简称ACID
1.原子性 (atomicity) : 事务是一个原子操作单元,对数据的修改,要么全都执行,要么全都不执行。
2.一致性 (consisten): 在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持事务的完整性;事务结束时,所有的内保部数据结果(如B数索引或双向链表,也都必须是正确的)
3.隔离性 (isolation): 数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行,这意为着事务处理过程中的中间       状态对外部是不可见的,反之亦然。
4.持久性 (durable) : 事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持

数据库的隔离级别


1.读未提交 read_uncommit
2.读已提交 read_commit          -可解决脏读
3.可重复读 repeatable_read     -可解决不可重复读
4.序列化 serializable                 -可解决幻读

并发事务处理的问题


1.更新丢失
2.脏读
3.不可重复读
4.幻读


1.更新丢失
     当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生更新丢失的问题,最后        的更新覆盖了由其他事务所做的更新
      如果在一个事务完成并提交事务之前,另一个事务不能访问同一行数据,则可以避免此问题
2.脏读
      事务A读取了事务B已修改但尚未提交的数据,此时如果事务B回滚,事务A读取的数据无效
3.不可重复读
     事务A读取数据后,再次读取时读到了事务B已经提交的修改数据,导致两次读取的数据不一致,不符合隔离性
4.幻读
     事务A读取数据后,再次读取时读到了事务B已经提交的新增数据,导致两次读取的数据不一致,不符合隔离性

行锁


mysql在更新并且没有commit之前会锁定该行记录
mysql默认的隔离级别可重复读
set autocommit = 0; //设置手动提交
update tab set a= 1 wher a =2;
commit
会话2可以正常查,但是更新会阻塞,等待会话1commit

在更新的时候,where条件要匹配索引,才会锁一行
索引失效会导致行锁变为表锁, 会话1未使用索引更新未提交时,会锁整表的数据


锁定一行

begin
select * from table where id = 3 for update;
#do it ......
commit

行锁的优化建议


1.尽可能的所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
2.合理设计索引,尽量缩小锁的范围
3.尽可能较少检索条件,避免间隙锁
4.尽量控制事务大小,较小锁定资源量和时间长度
5.尽可能低级别事务隔离

 

 

 

 

 

 

 

 

### 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`, 或者涉及结构调整的动作则不然——它们均隐含着相应的独占权限需求以便顺利完成各自预定目标的同时维护整体逻辑连贯性不受干扰。 --- ### 性能优化建议 为了缓解由不当使用所引发的各种瓶颈状况,可以从以下几个方面着手改进方案设计思路: - 尽量缩短每个单独事物持续周期长度; - 减少不必要的大范围扫描动作频率; - 合理规划索引体系架构以加速定位速度进而降低竞争概率; - 考虑引入乐观控制方法论代替传统悲观模式等等措施都有助于提升系统的响应效率和服务质量水平。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值