+ -
当前位置:首页 → 问答吧 → 个人乐观锁实现(附:貌似是个BUG)

个人乐观锁实现(附:貌似是个BUG)

时间:2011-05-26

来源:互联网

TP的乐观锁必须继承高级模型,虽然有动态模型可调用,但我觉得还是有点不太方便,所以就自己写了个方法。思路还是根据TP的思路来的,调用edit表单时记录该信息上次操作的时间保存入$_SESSION(数据库表里面必须有可表示唯一的字段,这里我用的是时间戳),在用户触发updata方法时判断$_SESSION内的值是否和该数据记录的时间戳是否一致,一致的话执行updata,否则抛出error

//乐观锁判断 $id为数据记录的时间 $timestamp 为$_SESSION中的时间戳
function checkLock($id = 0,$timestamp = 0){
  $result = $this->field('operator,otime')->getById($id);
  if(!empty($timestamp) && !empty($result['otime'])){
   if($timestamp == $result['otime']){
    return true;
   }else{
    $this->error = '数据已被'.$result['operator'].'用户更改!';
        return false;
   }
  }else{
   $this->error = '数据不正确!';
     return false;
  }
}

调用:
if(false == $this->model->checkLock($data['id'],$_SESSION['otime']))
      $this->error('操作失败:'.$this->model->getError());


BUG:基类调用基类方法,子类不触法_before_前置方法 附上举例代码
class abcAction extends Action{
public function a(){
$this->b();
}

public function b(){
echo "b";
}
}

class cbaAction extends abcAction{
public function _before_b(){
echo "老子就是不被调用!";
}
}


调用cbaAction 的 a()方法 _before_b不会被调用,不知是我的问题还是BUG?请教高手~~

作者: beyond5l   发布时间: 2011-05-26

哎 meiren

作者: beyond5l   发布时间: 2011-05-27