關於thinkphp連貫操作加鎖的詳細介紹lock

weixin_33860722發表於2017-10-10

我以為可以減少下訂單出錯的辦法

首先,資料庫型別要是InnoDB,其次,加鎖必須跟事務同時使用,還有,查詢的時候都必須帶鎖,比如: $user_mod->lock(true)->where('id=1')->select();這個地方用鎖查詢,其次地方如果查詢這個user物件需要防止同時操作的話也要進行加鎖,就是也要用lock(true)這種方式查詢:
程式碼示例如下:

        M()->startTrans();//開啟事務
        $map['userid']='test';//查詢條件
        $user = M('User')->lock(true)->where($map)->find();//加鎖查詢
        if($user)
        {
            //執行你想進行的操作, 最後返回操作結果 result
            $result = true;
            if(!$result)
            {
                M()->rollback();//回滾
                $this->error('錯誤提示');
            }
        }
        M()->commit();//事務提交
        $this->success('成功提示');

加上lock(true)的實際就是在查詢語句最後加上 for update,可以用如下這種方法測試,開兩個視窗,一個視窗開啟事務,然後查詢加鎖一條資料,另一個視窗再次查詢加鎖這條資料,你會發現另一個視窗的查詢會一直等待,直到第一個視窗的事務提交。如圖:

3065831-4e313d5278c33a21.png
Paste_Image.png

相關文章