开发者社区> 问答> 正文

MySQL悲观锁、乐观锁性能对比,数据库报错

都说在高并发的时候MySQL乐观锁性能比悲观锁好很多,为什么我遇到的情况恰恰相反?
我做了一个抢购商品的网站,一开始(不使用Redis等缓存的情况下)使用MySQL悲观锁,性能不是很好,后来改为乐观锁,通过版本号version来保证数据一致性,然后通过多线程来模拟高并发请求的情况,发现在使用乐观锁的情况下性能比悲观锁差了太多,原因是使用乐观锁的情况下,当一个线程尝试去更新一条MySQL记录的时候,不巧发现版本号(version)改变了,也就是说有其他的线程抢先一步更改了这条记录,为了保证数据一致性,那么当前线程的更新操作将失败,此时将重新发起更新操作。这样的“更新失败”情况大量发生,导致本来一次更新操作就可以完成的事情需要重复多次甚至十几次才能完成,最终导致系统性能急剧下降反而不如悲观锁性能。请问各位大神这种情况有什么更好的解决方案?

![image.png](https://ucc.alicdn.com/pic/developer-ecology/37c5db05ea8441e29782ae1cfa733a96.png)

展开
收起
python小菜菜 2020-06-01 19:40:20 1292 0
1 条回答
写回答
取消 提交回答
  • "可以现在本地来保证数据的顺序访问,避免多个线程争夺同一条数据######但是在高并发的情况下,请求都是来个成千上万的不同客户端,如何在本地保证按顺序访问?而且悲观锁的本质实际上就是让多个不同的请求按顺序访问吧!######

    我的意思是先预加载数据库数据到本地,然后再做加锁或者乐观锁,因为用字段来做乐观锁在数据库还是用的行锁来保证的吧

    ######回复 <a href=""https://my.oschina.net/u/2505401"" class=""referer"" target=""_blank"">@Milk丿小庄 : java内部的cas是用的cpu本身支持的功能做的,而你用mysql的字段来做,当然效率低了######嗯 这样倒是可以,相当于缓存了嘛。我其实就是想知道为啥乐观锁和悲观锁的性能和书上、网上讲的都不一样 哈哈哈" image.png

    2020-06-01 19:40:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像