SQL优化 ----锁机制

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

示例:  当仓库中最后一件衣服时,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引擎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值