Java教程

如何通过乐观锁解决并发的写写冲突

本文主要是介绍如何通过乐观锁解决并发的写写冲突,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

MySQL事务
这篇随笔提到过MVCC只解决读写冲突,没有解决写写冲突,传统解决的方案是使用select ... for update锁住数据。

如何通过乐观锁解决并发的写写冲突

事务1在查询余额为400,准备更新为400+500=900时,在查询和更新之间,又有事务2把数据库里的值改成了500,这时事务1更新的结果就出现了错误。
image

解决方案

加一个version_字段,正常情况下,事务1更新成功,版本号由1更新为2。当发生写写冲突后,事务2先更新版本号为2,而事务1通过查询版本号=1是更新不到数据的,没有更新数据的事务1,update语句会返回0,0代表没有做任何更新。但是这样用户体验非常不好,解决这个问题有两个方案:

  • 前端应用提示“数据正在处理,请稍后再试”。
  • 附加Spring-retry在service上进行方法重试。

image

重试伪代码:
image

Re

这篇关于如何通过乐观锁解决并发的写写冲突的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!