利用 数据库行锁解决高并发超卖现象

解决高并发超卖现象的方法有三种 之前我写了两种 然后就忘了这个 【哭笑不得】

首先我们要知道什么是行锁与表锁
注意:MyISAM引擎只支持表锁,而InnoDB既支持表锁又支持行锁

【行锁是什么,什么时候触发行锁】
行锁:顾名思义,就是给一条(一行)数据加一个锁,当一条数据加了锁之后,其它操作无法进行
如:A端对一条数据操作时加了行锁,B端、C端就无法进行操作,操作阻塞
行锁只有在进行增删改一条数据时并且正确使用了索引,那么InnoDB引擎就会自动加一个行锁 当然你也可以自己加

【表锁是什么,什么时候触发表锁】
表锁嘛 肯定就是把整张表锁起来啦 至于触发原因就是未使用索引的情况下进行全表搜索查找,引擎就会把整张表锁起来

【行锁变表锁】
大部分都是索引的原因 这些网上都查的到 我就不说了

【索引失效】
1、使用函数 把索引当做函数参数
2、索引在运算表达式的一边
3、使用or
4、使用like% 注意:%放在右边并不会失效 放在左边必定索引失效

【建立索引原则】
1、表数据大于300条时
2、经常进行查询的表
3、需要保证数据唯一性的表
4、经常进行排序、分组的字段

【不适合建立索引】
1、区分度不高的字段 如:性别你建立索引,只要男女,顶多加点les、gay、mtf什么的 建立索引那不是神经病嘛
2、表数据很少
3、根本用不到索引
4、进行计算

【悲观锁与乐观锁】
行锁分为两种:悲观锁与乐观锁
悲观锁:就好像你在银行取了一大笔钱,你很害怕 你觉得有一群人想抢你的钱
乐观锁:你在银行取了钱,你认为人们都很好很善良,不会有人打劫你

【如何使用】

悲观锁:你在进行增删改的时候 SQL语句加上一个 for update 不过原生与封装之后的使用是不一样的 原生SQL只需要在最后加上for update就可以了 像Db话:DB:name(“users”)->where(“id”,1)->lock(true)->select();//lock等于true时就是加上行锁

乐观锁: 乐观锁的话就是利用数据版本来控制,再修改之前先取出库存数量(kucun) 在写SQL时 and table_kucun = kucun 就是加一个判断,判断一下刚才取出来的数量是否与现在的匹配,不匹配就抛异常进行事务回滚

具体代码我也就懒得贴了 实在是懒…

以上个人亲测,记得加上事务,不然你会亏死

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值