分享

一个典型支付系统的设计与实现 -- 系统架构 -- IT技术大学习 -- 共学习 共进步!

 mzsm 2015-02-24
class AppLock{    function __construct($appid)    {        $this->m_appid = $appid;        //初始化数据        $this->get();    }     function __destruct()    {        $this->free();    }      public function alloc()    {        if ($this->m_bGot == true)        {            return true;        }         $this->repairData();         $appid = $this->m_appid;        $ret = $this->update($appid,APPLOCK_MODE_FREE,APPLOCK_MODE_ALLOC);        if ($ret === false)        {            app_error_log('applock alloc fail');            return false;        }        if ($ret <= 0)        {            app_error_log('applock alloc fail,affected_rows:$ret');            return false;        }        $this->m_bGot = true;        return true;    }     public function free()    {        if ($this->m_bGot != true)        {            return true;        }         $appid = $this->m_appid;        $ret = $this->update($appid,APPLOCK_MODE_ALLOC,APPLOCK_MODE_FREE);        if ($ret === false)        {            app_error_log('applock free fail');            return false;        }        if ($ret <= 0)        {            app_error_log('applock free fail,affected_rows:$ret');            return false;        }        $this->m_bGot = false;        return true;    }     function repairData()    {        $db = APP_DB();         $appid = $this->m_appid;         $now = time();         $need_time = $now - APPLOCK_REPAIR_SECS;         $str_need_time = date('Y-m-d H:i:s', $need_time);         $db->where('appid',$appid);        $db->where('lock_mode',APPLOCK_MODE_ALLOC);        $db->where('change_time <=',$str_need_time);         $db->set('lock_mode',APPLOCK_MODE_FREE);        $db->set('change_time','NOW()',false);         $ret = $db->update(TB_APPLOCK);        if ($ret === false)        {            app_error_log('repair applock error,appid:$appid');            return false;        }        return true;    }     private function get()    {        $db = APP_DB();         $appid = $this->m_appid;         $db->where(\'appid\', $appid);         $query = $db->get(TB_APPLOCK);         if ($query === false)        {            app_error_log('AppLock get fail.appid:$appid');            return false;        }         if (count($query->result_array()) <= 0)        {            $applock_data = array(                \'appid\'=>$appid,                \'lock_mode\'=>APPLOCK_MODE_FREE,            );            $db->set(\'change_time\',\'NOW()\',false);            $ret = $db->insert(TB_APPLOCK, $applock_data);            if ($ret === false)            {                app_error_log('applock insert fail:$appid');                return false;            }             //重新获取数据            $db->where(\'appid\', $appid);            $query = $db->get(TB_APPLOCK);             if ($query === false)            {                app_error_log('AppLock get fail.appid:$appid');                return false;            }            if (count($query->result_array()) <= 0)            {                app_error_log('AppLock not data,appid:$appid');                return false;            }        }        $applock_data = $query->row_array();        return $applock_data;    }     private function update($appid,$old_lock_mode,$new_lock_mode)    {        $db = APP_DB();         $db->where(\'appid\',$appid);        $db->where(\'lock_mode\',$old_lock_mode);         $db->set(\'lock_mode\',$new_lock_mode);        $db->set(\'change_time\',\'NOW()\',false);         $ret = $db->update(TB_APPLOCK);        if ($ret === false)        {            app_error_log('update applock error,appid:$appid,old_lock_mode:$old_lock_mode,new_lock_mode:$new_lock_mode');            return false;        }        return $db->affected_rows();    }     //是否获取到了锁    public $m_bGot = false;     public $m_appid;}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多