我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下
前提:什么是数据库更新丢失?
举个栗子,假设有如下情况:
1、小A查询了数据库
2、小B也查询了数据库,两个人不在同一个session中
3、小A修改了数据库中的一行,并提交
4、小B也修改了数据库的一行,但提交晚于小A
这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题
解决方案:
1、悲观锁
通过采用select for update或者select for update nowait,
逻辑是:
小A先查
小B后查
小B的查询会锁住,在页面的表现应该就是阻塞,什么数据也没有。
2、乐观锁
采用在数据库中表中加版本号和时间戳的形式进行加锁,项目中采用的是时间戳的形式,因为个别表中有这个字段:op_tm–操作时间。
逻辑是:
在update的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。