自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下
前提:什么是数据库更新丢失?
举个栗子,假设有如下情况:
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的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。
下面where语句的最后的判断就是比较的时间戳:
创建人 | 周晨 |
文档编辑权限 | 创建者私有 |
文档阅读权限 | 来自分类 |
分类阅读权限 | 所有人 |
分类编辑权限 | 所有人 |
分类审核权限 | 无 |
修改日期 | 修改人 | 备注 |
2017-09-18 09:35:14[当前版本] | 周晨 | CREAT |