如何通过乐观锁解决并发的写写冲突
作者:互联网
MySQL事务
这篇随笔提到过MVCC只解决读写冲突,没有解决写写冲突,传统解决的方案是使用select ... for update锁住数据。
如何通过乐观锁解决并发的写写冲突
事务1在查询余额为400,准备更新为400+500=900时,在查询和更新之间,又有事务2把数据库里的值改成了500,这时事务1更新的结果就出现了错误。
解决方案
加一个version_字段,正常情况下,事务1更新成功,版本号由1更新为2。当发生写写冲突后,事务2先更新版本号为2,而事务1通过查询版本号=1是更新不到数据的,没有更新数据的事务1,update语句会返回0,0代表没有做任何更新。但是这样用户体验非常不好,解决这个问题有两个方案:
- 前端应用提示“数据正在处理,请稍后再试”。
- 附加Spring-retry在service上进行方法重试。
重试伪代码:
Re
标签:事务,版本号,更新,写写,并发,冲突,解决 来源: https://www.cnblogs.com/bllbl/p/15388002.html