SQL优化 ----锁机制

2021-03-16 21:02:00 浏览数 (1)

锁机制: 解决因资源共享 而造成的并发问题。

示例: 当仓库中最后一件衣服时,A这时候下单,随后B也同一时间下单,这时候就会出现问题,到底这最后一件衣服卖给了谁?所以就要通过锁来解决这种问题。

衣服: A来的时候加锁 ---> 然后A就可以下单。。。付款。。。打包 等操作 --> 解锁

B来的时候 ---> 显示等待解锁 ----> 发现已售空

锁的分类:

操作类型:

a:读锁(共享锁): 对同一个数据(衣服),多个读操作可以同时进行,互不干扰。

b:写锁(互斥锁): 如果当前写操作没有完成(买衣服的一系列操作),则无法进行其他的操作。

操作范围:

在某一个会话0里,假如对A表加了read锁(读锁) 则在 该会话0 中可以对A表进行读操作(select),不能进行写操作(update、delect、insert); 对其他表读写都不行; 在 其他会话 中可以对A表进行读操作,而 写操作 需要等待 会话0 将锁释放; 对除A表以外的表可以读写;

在某一个会话0里,假如对A表加了写锁 则在 该会话0 中可以对A表 进行任何操作; 但对其他表不能操作; 在 其他会话中 需要等待 会话0 释放写锁 才能对A表进行增删改查;

注意事项:

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁;

在执行更新操作(DML)前,会自动给涉及的表加写锁;

所以:

1.对MyISAM表的读操作(加读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作;

2.对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,之后当写锁释放后,才会执行其他进程的读写操作;

a:表锁 : 一次性对一张表整体加锁,如MyISAM存储引擎使用表锁 开销小,加锁快;无死锁;但锁的范围大,容易发生锁冲突、并发度低。

b:行锁 :一次性对一条数据加锁 如InnoDb存储引擎 开销大,加锁慢;容易出现死锁;

mysql默认自动commit;oracle默认不会自动commit; 为了研究行锁,暂时将自动commit关闭; set autocommit = 0 ; 以后需要通过commit提交 会话0对某a这行数据进行DML操作时,其他会话需要等待解锁才能对a这条数据进行操作; 面对不同行的数据时,一个锁一行数据,不同数据则互不干扰;

c:页锁

分析表锁定:

查看哪些表加了锁: show open tables ; 1代表被加了锁

分析表锁定的严重程度: show status like 'table%' ;

@1 Table_locks_immediate :即可能获取到的锁数

@2 Table_locks_waited: 需要等待的锁数(如果该值越大,说明存在越大的锁竞争)

一般建议: 当@1/@2 > 5000时, 建议采用InnoDB引擎,否则用MyISAM引擎

0 人点赞