7.mysql 锁

本文详细介绍了MySQL InnoDB存储引擎的锁机制,包括锁的类型(如读锁、写锁等),行锁的不同形式(如记录锁、间隙锁等),以及如何避免死锁等问题。

1.锁:

Innodb支持行锁,有时也会升级为表锁;MyISAM只支持表锁。

表锁特点:开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突概率高,并发度相对低。

行锁特点:开销大,辊锁慢;会出现死锁,锁粒度小,发生锁冲突概率低,并发度也相对行锁较高。

 

Innodb锁类型:读锁(共享锁)、写锁(排他锁)、意向锁和MDL锁。

 

读锁:(1)自动提交方式下select语句,不需要加锁,叫一致性非锁定读;

(2)通过select …….lock in share mode在被读取的行记录或行记录范围上加一个锁,让其他事务可以读,但是申请加写锁,会阻塞。

 

写锁:X锁,比较特殊的为select  for update,对读取的行记录上加锁。

 

MDL锁:mysql5.5引入meta data lock,保证表中元数据的信息:

begin:

select * from tt

会话B:

begin:

alter table tt add num tinyint(1) not null default  0;

show full processlist;

 

意向锁:意向共享锁(IS):

意向排他锁(IX)指在给一个数据行加排他锁前必须先取得该表的IX锁。

 

2.Innodb行锁各类:

默认为RR事务隔离级,并且参数innodb_blocks_unsafe_for_binlog=0的模式下,行锁有三种:

  1. 单个行记录的锁(record lock)
  2. 间隙锁(GAP lock)
  3. 记录锁和间隙锁的组合叫作next-key lock(普通索引默认模式)

Innodb的行锁是加在索引上的,若在没有索引的表中update 两个窗口不同的值,会锁表中整个行。

 

加间隙锁(只针对RR隔离级别):

begin;

select * from tt where score<80 lock in share mode;

会话B:

Select * from tt;

Beging;

Insert into tt (name,score) values(‘dd’,75); 会锁

锁等待:

通过innodb_lock_wait_timeout参数控制,单位为秒

mysql> show variables like '%innodb_lock_wait%';

例:死锁:

A会话:

begin;

update tt set name=’aaa’ where score=60;  (1次)

update tt set name=’bb’ where score=70; (2次)锁

B会话:

begin:

update tt set name=’a’ where score=70; (1次)  正常

update tt set name=a’ where score=60;  (2次)  锁

通过show engine innodb status 查看死锁状态的展示信息

避免死锁:

  1. 不同程序多表存取并发或涉及多行记录时,尽量以相同顺序访问表;
  2. 业务中尽量采用小事务,避免使用大事务,及时提交或回滚事务;
  3. 同一个事务中,尽可能做到一次锁定所需要资源,减少死锁;
  4. 对非常容易产生死锁的业务部分,尝试使用升级锁粒度,通过表锁定减少死锁。

 

锁监控:

通常情况:show full processlist 和show engine innodb status命令来判断事务中锁问题情况,还有特别重要三张表:information_schema库下innodb_trx、innodb_locks、innodb_lock_waits。

例:会话A:

begin;

select * from tt where score <85 for update ; 加上写锁。

会话B:出现锁等待超时。

begin;

insert into tt (name,score) values (‘dd’,84);

分析:

use information_schema;

select * from innodb_trx\G;

trx_id:唯一事务id号。

trx_state:当前事务的状态

trx_wait_started:事务开始等待的时间

trx_mysql_thread_id:线程id,与show full processlist相对应

trx_query:事务运行的sql语句

trx_operation_state:事务运行的状态

 

 

 

需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕需求响应动态冰蓄冷系统及其优化策略展开研究,结合Matlab代码实现,探讨了在电力需求侧管理背景下,冰蓄冷系统如何通过优化运行策略参与需求响应,以实现削峰填谷、降低用电成本和提升能源利用效率的目标。研究内容包括系统建模、负荷预测、优化算法设计(如智能优化算法)以及多场景仿真验证,重点分析不同需求响应机制下系统的经济性和运行特性,并通过Matlab编程实现模型求解与结果可视化,为实际工程应用提供理论支持和技术路径。; 适合人群:具备一定电力系统、能源工程或自动化背景的研究生、科研人员及从事综合能源系统优化工作的工程师;熟悉Matlab编程且对需求响应、储能优化等领域感兴趣的技术人员。; 使用场景及目标:①用于高校科研中关于冰蓄冷系统与需求响应协同优化的课题研究;②支撑企业开展楼宇能源管理系统、智慧园区调度平台的设计与仿真;③为政策制定者评估需求响应措施的有效性提供量化分析工具。; 阅读建议:建议读者结合文中Matlab代码逐段理解模型构建与算法实现过程,重点关注目标函数设定、约束条件处理及优化结果分析部分,同时可拓展应用其他智能算法进行对比实验,加深对系统优化机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值