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代表没有做任何更新。但是这样用户体验非常不好,解决这个问题有两个方案:
重试伪代码: