mysql 并发_面试官:mysql的悲观锁怎么防并发的 程序员:没考虑并发

Java语言、程序员、后端开发、多线程高并发

吐槽

程序员汪进新公司

开发业务代码,类似某内容的上下线功能

忘记考虑高并发场景

导致生产出现了脏数据

解决方案最简单粗暴的就是mysql的悲观锁,这里写不谈其他锁,如缓存锁、乐观锁等等。

mysql的锁其实分很多种,我这里就讲了最简单的应用场景

基础准备

  • 多线程
  • 高并发
  • 串行锁
  • mysql行锁

先从mysql层面分析案例

先创建一张表

05f23a2597443b66f4db055a40a177c2.png

唯一索引

603d4c55fbfcaf9b97dfa761cbc61ad9.png

初始化数据

注意bizType就是定义的枚举值类型,bizId就是内容的ID

如内容上下线必须加串行锁来防止并发

17ccc0f681425aa17ffc5d3139638184.png

注意我把MySQL调整成需要手动提交事务

set session autocommit=0; 就这行命令搞定

dec54b815ab80f398d63c322181f0996.png

窗口1开启一个事务begin

618af2e8a03a564c3b67269b5e32466c.png

我打开另一个窗口2,执行相同的SQL

会发现一直执行中

ed9c9b286950acebde75e0fd54d9c4ab.png

当窗口1提交COMMIT后,窗口2才能继续执行完成。

总结

  • 利用mysql的for update悲观锁来防并发,简单有效
  • for update 切记后面要是索引的查询条件,如上唯一索引
  • 业务代码中切记在事务代码中去操作
  • 特别是审批业务,都必须考虑并发情况
  • 这里先不谈其他锁

java代码

串行锁防并发

事务开启

select XXX where 唯一索引 for udpate

初次调用需要 insert 这个common_trace表

//TODO 其他业务DB操作

事务提交

欢迎程序员专家喷我,指出我的问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值