最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Yii框架實現(xiàn)樂觀鎖與悲觀鎖流程詳解

 更新時間:2022年11月02日 16:21:07   作者:huaweichenai  
樂觀鎖(optimistic locking)表現(xiàn)出大膽、務(wù)實的態(tài)度。使用樂觀鎖的前提是, 實際應(yīng)用當(dāng)中,發(fā)生沖突的概率比較低。他的設(shè)計和實現(xiàn)直接而簡潔。 目前Web應(yīng)用中,樂觀鎖的使用占有絕對優(yōu)勢。悲觀鎖正如其名字,悲觀鎖(pessimistic locking)體現(xiàn)了一種謹(jǐn)慎的處事態(tài)度

一、在Yii中實現(xiàn)樂觀鎖

樂觀鎖(optimistic locking)表現(xiàn)出大膽、務(wù)實的態(tài)度。使用樂觀鎖的前提是, 實際應(yīng)用當(dāng)中,發(fā)生沖突的概率比較低。他的設(shè)計和實現(xiàn)直接而簡潔。 目前Web應(yīng)用中,樂觀鎖的使用占有絕對優(yōu)勢。因此在Yii為ActiveReocrd樂觀鎖支持

1、在yii中實現(xiàn)樂觀鎖步驟

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

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

2、Yii中實現(xiàn)樂觀鎖

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

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

public function optimisticLock()
{
    return null;
}

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

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

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

3、實現(xiàn)樂觀鎖

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

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

在更新過程中,我們會調(diào)用到 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);
// 如果已經(jīng)啟用了樂觀鎖,但是卻沒有完成更新,或者更新的記錄數(shù)為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;
}

在刪除過程中,我們會調(diào)用到 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中已經(jīng)有了樂觀鎖相關(guān)的代碼了,我們只需要在Model中設(shè)置一個版本號字段即可

二、在Yii中實現(xiàn)悲觀鎖

正如其名字,悲觀鎖(pessimistic locking)體現(xiàn)了一種謹(jǐn)慎的處事態(tài)度

1、在yii中實現(xiàn)悲觀鎖的步驟

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

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

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

2、yii中悲觀鎖實現(xiàn)

使用select.....for update實現(xiàn)悲觀鎖,簡單示例如下:

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

到此這篇關(guān)于Yii框架實現(xiàn)樂觀鎖與悲觀鎖流程詳解的文章就介紹到這了,更多相關(guān)Yii樂觀鎖與悲觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php中3種方法統(tǒng)計字符串中每種字符的個數(shù)并排序

    php中3種方法統(tǒng)計字符串中每種字符的個數(shù)并排序

    3種方法,統(tǒng)計字符串中每種字符的個數(shù)并排序,多種解法喲~ str_split()函數(shù)很重要
    2012-08-08
  • 用PHP調(diào)用Oracle存儲過程的方法

    用PHP調(diào)用Oracle存儲過程的方法

    php程序訪問數(shù)據(jù)庫,完全可以使用存儲過程,有人認(rèn)為使用存儲過程便于維護。不過仁者見仁,智者見智,在這個問題上,偶認(rèn)為使用存儲過程意味著必須要dba和開發(fā)人員更緊密配合,如果其中一方更變,則顯然難以維護。
    2008-09-09
  • php獲取ajax的headers方法與內(nèi)容實例

    php獲取ajax的headers方法與內(nèi)容實例

    下面小編就為大家分享一篇php獲取ajax的headers方法與內(nèi)容實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Thinkphp3.2.3整合phpqrcode生成帶logo的二維碼

    Thinkphp3.2.3整合phpqrcode生成帶logo的二維碼

    這篇文章主要為大家詳細(xì)介紹了Thinkphp3.2.3整合phpqrcode生成帶logo的二維碼的實現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • php讀取html并截取字符串的簡單代碼

    php讀取html并截取字符串的簡單代碼

    一般php采集代碼能用的到,這里只是簡單的實現(xiàn)代碼。
    2009-11-11
  • CI框架源碼閱讀,系統(tǒng)常量文件constants.php的配置

    CI框架源碼閱讀,系統(tǒng)常量文件constants.php的配置

    CI框架源碼閱讀,系統(tǒng)常量文件constants.php的配置,需要的朋友可以參考一下
    2013-02-02
  • PHP中預(yù)定義的6種接口介紹

    PHP中預(yù)定義的6種接口介紹

    這篇文章主要介紹了PHP中預(yù)定義的6種接口介紹,本文講解了Traversable、Iterator、IteratorAggregate、ArrayAccess、Serializable、Closure,需要的朋友可以參考下
    2015-05-05
  • php基本函數(shù)匯總

    php基本函數(shù)匯總

    本文給大家匯總了16個常見的php基本函數(shù),涵蓋的面很廣,這里推薦給大家,希望對大家學(xué)習(xí)php能夠有所幫助。
    2015-07-07
  • Gregarius中文日期格式問題解決辦法

    Gregarius中文日期格式問題解決辦法

    Gregarius支持中文的程度很不錯,唯一的缺陷就是在日期格式上會出現(xiàn)亂碼。其實只要修改根目錄下util.php文件的rss_locale_date方法就可以解決這個問題,希望可以幫助使用Gregarius的朋友,修改后的方法代碼如下:
    2008-04-04
  • PHP快速排序算法實例分析

    PHP快速排序算法實例分析

    這篇文章主要介紹了PHP快速排序算法,結(jié)合實例形式分析了快速排序的原理、步驟及相關(guān)php定義與使用操作技巧,需要的朋友可以參考下
    2018-07-07

最新評論

阜阳市| 麻江县| 齐河县| 中牟县| 阿拉善右旗| 义马市| 南丰县| 山丹县| 安庆市| 呈贡县| 元江| 福建省| 革吉县| 高碑店市| 凤凰县| 铜梁县| 岑溪市| 瑞昌市| 聊城市| 磐安县| 汶川县| 波密县| 竹溪县| 明水县| 含山县| 成安县| 平武县| 崇仁县| 克什克腾旗| 济宁市| 融水| 文山县| 西乌珠穆沁旗| 隆化县| 临高县| 赣州市| 天峻县| 开阳县| 库伦旗| 老河口市| 咸丰县|