开发中遇到的数据库更新丢失问题

我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下

前提:什么是数据库更新丢失?

举个栗子,假设有如下情况:

 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的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。