日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Yii框架實現樂觀鎖與悲觀鎖流程詳解

瀏覽:245日期:2022-06-06 08:31:21
目錄
  • 一、在Yii中實現樂觀鎖
    • 1、在yii中實現樂觀鎖步驟
    • 2、Yii中實現樂觀鎖
    • 3、實現樂觀鎖
  • 二、在Yii中實現悲觀鎖
    • 1、在yii中實現悲觀鎖的步驟
    • 2、yii中悲觀鎖實現

一、在Yii中實現樂觀鎖

樂觀鎖(optimistic locking)表現出大膽、務實的態度。使用樂觀鎖的前提是, 實際應用當中,發生沖突的概率比較低。他的設計和實現直接而簡潔。 目前Web應用中,樂觀鎖的使用占有絕對優勢。因此在Yii為ActiveReocrd樂觀鎖支持

1、在yii中實現樂觀鎖步驟

1、給需要加鎖的表添加一個字段,用于表示版本號,這里我一般選手version字段作為版本號字段,注意,如果你需要加鎖的表已經生成Model了,那么對應表的Model要將你添加的版本號字段(version)信息加入Model

2、在更新表中字段時,使用 try ... catch 看看是否能捕獲一個 yii\db\StaleObjectException 異常,如果捕捉到yii\db\StaleObjectException 異常,說明在本次修改這個記錄的過程中, 該記錄已經被修改過了,作出相應提示

2、Yii中實現樂觀鎖

1、在yii中聲明指定字段為版本號

版本號是實現樂觀鎖的根本所在。所以第一步,我們要告訴Yii,哪個字段是版本號字段,聲明版本號的方法由yii\db\BaseActiveRecord(vendor/yiisoft/yii2/db/BaseActiveRecord)中的optimisticLock方法負責

public function optimisticLock()
{
    return null;
}

這個方法返回 null ,表示不使用樂觀鎖,如果我們需要使用樂觀鎖的話,我們需要在我們的需要加鎖的表的Model中重載optimisticLock方法

public function optimisticLock()
{
    return "version";
}

如上說明當前的ActiveRecord中,有一個 version 字段,可以為樂觀鎖所用

3、實現樂觀鎖

我們在Model中設置了版本號后,這時候我們的更新和刪除都是樂觀鎖操作了,與正常操作數據庫的方式一致

try {
    $crowd = Crowd::findOne(["crowd_id" => 12]);
    $crowd->status = 1;
    $crowd->save();
} catch (\Exception $e) {
    return false;
}

在更新過程中,我們會調用到 yii\db\BaseActiveRecord::updateInternal()方法,此方法里面就具有處理樂觀鎖的代碼

protected function updateInternal($attributes = null)
{
    if (!$this->beforeSave(false)) {
      return false;
    }
    // 獲取等下要更新的字段及新的字段值
    $values = $this->getDirtyAttributes($attributes);
    if (empty($values)) {
      $this->afterSave(false, $values);
      return 0;
    }
    // 把原來ActiveRecord的主鍵作為等下更新記錄的條件,也就是說,等下更新的,最多只有1個記錄。
    $condition = $this->getOldPrimaryKey(true);
    // 獲取版本號字段的字段名,比如 version
    $lock = $this->optimisticLock();
    // 如果 optimisticLock() 返回的是 null,那么,不啟用樂觀鎖。
    if ($lock !== null) {
    // 這里的 $this->$lock ,就是 $this->version 的意思; 這里把 version+1 作為要更新的字段之一。
      $values[$lock] = $this->$lock + 1;
      // 這里把舊的版本號作為更新的另一個條件
      $condition[$lock] = $this->$lock;
    }
    $rows = static::updateAll($values, $condition);
// 如果已經啟用了樂觀鎖,但是卻沒有完成更新,或者更新的記錄數為0;
  // 那就說明是由于 version 不匹配,記錄被修改過了,于是拋出異常。
    if ($lock !== null && !$rows) {
      throw new StaleObjectException("The object being updated is outdated.");
    }
    if (isset($values[$lock])) {
      $this->$lock = $values[$lock];
    }
    $changedAttributes = [];
    foreach ($values as $name => $value) {
      $changedAttributes[$name] = isset($this->_oldAttributes[$name]) ? $this->_oldAttributes[$name] : null;
      $this->_oldAttributes[$name] = $value;
    }
    $this->afterSave(false, $changedAttributes);
    return $rows;
}

在刪除過程中,我們會調用到 yii\db\BaseActiveRecord::delete()方法,此方法里面就具有處理樂觀鎖的代碼

public function delete()
    {
$result = false;
if ($this->beforeDelete()) {
    // 刪除的SQL語句中,WHERE部分是主鍵
    $condition = $this->getOldPrimaryKey(true);
    // 獲取版本號字段的字段名,比如 version
    $lock = $this->optimisticLock();
    // 如果啟用樂觀鎖,那么WHERE部分再加一個條件,版本號
    if ($lock !== null) {
$condition[$lock] = $this->$lock;
    }
    $result = static::deleteAll($condition);
    if ($lock !== null && !$result) {
throw new StaleObjectException("The object being deleted is outdated.");
    }
    $this->_oldAttributes = null;
    $this->afterDelete();
}
return $result;
    }

如上我們就知道了,在yii中已經有了樂觀鎖相關的代碼了,我們只需要在Model中設置一個版本號字段即可

二、在Yii中實現悲觀鎖

正如其名字,悲觀鎖(pessimistic locking)體現了一種謹慎的處事態度

1、在yii中實現悲觀鎖的步驟

1、在對任意記錄進行修改前,先嘗試為該記錄加上鎖

2、如果加鎖失敗,說明該記錄正在被修改,那么當前查詢可能要等待或者拋出異常

3、如果成功加鎖,那么就可以對記錄做修改,事務完成后就會解鎖了

2、yii中悲觀鎖實現

使用select.....for update實現悲觀鎖,簡單示例如下:

$transaction = Yii::$app->db->beginTransaction();
try{
    //查詢id為12的這條數據并且鎖定
    $sql = "select * from ubo_crowd where crowd_id = 12 for update";
    $crowd = Yii::$app->db->createCommand($sql)->queryOne();
    //更新數據
    $crowd1 = Crowd::findOne(["crowd_id" => $crowd["crowd_id"]]);
    $crowd1->sort += 1;
    if($crowd1->save()){
$transaction->commit();
    }
}catch(Exception $e){
    $transaction->rollBack();
}

到此這篇關于Yii框架實現樂觀鎖與悲觀鎖流程詳解的文章就介紹到這了,更多相關Yii樂觀鎖與悲觀鎖內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
影音先锋久久精品| 久久亚洲国产| 久久精品国产久精国产爱| 精品亚洲成人| 日韩精品首页| 色天使综合视频| 亚洲在线电影| 青青国产精品| 久久女人天堂| 精品国产乱码久久久久久1区2匹| 亚洲tv在线| 国产麻豆综合| 在线一区av| а√天堂8资源中文在线| 伊人网在线播放| 国产精品一区二区精品 | 亚洲精品精选| 四虎国产精品免费久久| 老司机久久99久久精品播放免费| 无码日韩精品一区二区免费| 日韩伦理在线一区| 国产麻豆一区二区三区| 日韩在线a电影| 国产精品毛片视频| 亚洲一区国产一区| 亚洲日本国产| 日韩欧美视频专区| 亚洲一二三区视频| 国产精品7m凸凹视频分类| 日韩久久一区| 日韩精品午夜视频| 欧美色综合网| 亚洲一区二区毛片| 国产亚洲一区二区三区啪| 男女性色大片免费观看一区二区| 久久精品午夜| 国产精品久久久久久久久免费高清| 成午夜精品一区二区三区软件| 精品久久电影| 久久久久一区| 欧美日韩18| 综合色就爱涩涩涩综合婷婷| 欧美日韩一二| jizzjizz中国精品麻豆| 久久精品99国产精品日本| 美女被久久久| 夜夜嗨网站十八久久| 国产精成人品2018| 91成人小视频| 日韩精品免费视频人成| 久久xxxx| 亚洲成人免费| 99riav1国产精品视频| 日韩一区亚洲二区| 亚洲精品韩国| 麻豆视频一区| 国产精品v日韩精品v欧美精品网站| 日韩av免费| 国产精品调教视频| 日韩影院精彩在线| 亚洲欧美日韩视频二区| 国产精品极品国产中出| 超碰在线99| 中文在线а√天堂| 久久97视频| 99久久精品网| 日韩国产成人精品| 精品一区二区三区视频在线播放| 国产一区二区三区不卡视频网站 | 国产精品密蕾丝视频下载| 亚洲女同中文字幕| 久热re这里精品视频在线6| 国产精品片aa在线观看| 日韩美女一区二区三区在线观看| 久久香蕉网站| 国产精品亚洲一区二区三区在线观看| 精品福利久久久| 91日韩免费| 午夜精品网站| 日韩精品一区二区三区免费视频| 日韩三级久久| 成人在线视频中文字幕| 久久九九精品| 日韩一区二区三区精品视频第3页| 91精品丝袜国产高跟在线| 久久av影视| 国产综合婷婷| 香蕉久久国产| 美腿丝袜亚洲一区| 日韩一区二区久久| 国产欧美日韩影院| 欧美一区二区三区高清视频| 久久国产精品亚洲77777| 国产精品中文字幕亚洲欧美 | 久久99免费视频| 91综合视频| 首页亚洲欧美制服丝腿| 乱一区二区av| 一区久久精品| 精品一区二区三区免费看| 日本一二区不卡| 久久亚洲图片| 免费日韩一区二区三区| 久热re这里精品视频在线6| 国产欧美高清| 激情丁香综合| 精品国产欧美日韩| 亚洲精品少妇| 尤物精品在线| 久久精品免费一区二区三区| 日韩午夜高潮| 国产经典一区| 免费高清在线一区| 91精品蜜臀一区二区三区在线| 日韩精品中文字幕吗一区二区| 91久久国产| 欧美片第1页| 日产午夜精品一线二线三线| 国产剧情在线观看一区| 亚洲人亚洲人色久| 蜜臀va亚洲va欧美va天堂| 婷婷综合六月| 神马日本精品| 日韩精品水蜜桃| 婷婷激情一区| 欧美国产91| 亚洲成人一区| 欧美日韩国产高清| 欧美午夜不卡| 黄色日韩在线| 欧美精品自拍| 蜜臀精品一区二区三区在线观看| 免费久久久久久久久| 日韩视频免费| 欧美日韩四区| 99xxxx成人网| 亚洲综合小说| 国产精品成人自拍| 成人在线免费观看网站| 久久久精品五月天| 91精品电影| 日韩精品1区2区3区| 国产激情综合| av一区在线| 激情婷婷综合| 蜜桃91丨九色丨蝌蚪91桃色| 日韩av资源网| 欧美国产小视频| 麻豆91精品| 精品欧美日韩精品| 久久一区二区中文字幕| 日韩综合小视频| 色婷婷精品视频| 日本亚洲最大的色成网站www | 国产一区视频在线观看免费| 蜜桃视频一区二区三区| 欧美91在线| 视频一区视频二区中文字幕| 日韩av影院| 久久亚洲国产| 欧美一级全黄| 亚洲天堂黄色| 国产精品任我爽爆在线播放| 1000部精品久久久久久久久| 日韩一区二区三区免费视频| 国产成人久久精品一区二区三区| 老司机久久99久久精品播放免费| 久久精品五月| 欧美一区二区三区久久| 婷婷亚洲五月| 亚洲精品福利电影| 中文字幕日韩高清在线| 日韩精品第一区| 中文字幕免费一区二区| 亚洲va中文在线播放免费| 国产欧美一级| 日本一区二区三区视频在线看| 夜夜嗨一区二区| 久久国产免费| 日韩一区三区| 97精品一区| 欧美国产亚洲精品| 欧美影院精品| 日韩欧美中文字幕在线视频| 99国产精品久久久久久久成人热| 日韩在线精品| 黑人精品一区| 国产成人精品一区二区三区免费 | 成人在线黄色| 精品99久久| 国产精品久久观看| 成人亚洲精品| 成人福利av| 韩国精品主播一区二区在线观看| 中文在线а√天堂| 日韩免费高清| 在线综合亚洲| 99国产精品久久久久久久| 美女被久久久| 日本视频中文字幕一区二区三区|