php mysql 丢失更新问题,搜索整个互联网,很少有讲到,也许和php程序员出身一般都是非科班出身有关系吧。
另外php程序一般都是简单数据,很少有并发一致性问题,所以大家都没有谁专门提出这个问题。
这个问题无法依靠数据库的并发机制进行控制,因为不是一回事。
丢失更新:(Lost Update)
事务T1读取了数据,并执行了一些操作,然后更新数据。事务T2也做相同的事,则T1和T2更新数据时可能会覆盖对方的更新,从而引起错误。
这里的事务不是指的数据库事务。
可以理解成两个不同的客户端。
举例:
在时间T1
PC机1 客户读到一条 message | pc机2 客户读到同一个message
修改 | 修改
时间t2
保存 时间t3
| 保存
=========================
请问这个时候数据库里面应该以谁保存的为准?
=============================
这个问题,只出现在多用户环境,并且多用户修改一个数据库记录。
解决这个问题有两种方式:
方法1, 简单数据,直接用 where 语句,加自己读到的old 数据作为条件,防止其他用户更新了
自己覆盖其更新。
方法2是,复杂数据,用一个integer ,或者longint字段version,控制版本。
每次更新的时候,执行:
update table1 set version=version+1 where version=修改前的version
控制了这个问题,会可能导致后更新的用户操作失败。
处理方式有两种:
直接刷新出最新记录。
提示用户更新失败,手动刷新最新记录。