Yii2.0의 트랜잭션 중첩

3419 단어
최근 프로젝트 개발에서 사용된 사무가 비교적 많다는 것을 특별히 기록합니다.
$tr = Yii::$app->db->beginTransaction();
try {
    if($this->delete() == false){
        throw new \Exception(json_encode ($this->getErrors ()));
    }
    $res = $userInfo_model->updateAll(['deleted'=>'1'],['deleted'=>0,'source'=>self::tableName(),'relation_id'=>$this->id]);
    if($res == true){
        throw new \Exception(json_encode ($userInfo_model->getErrors ()));
    }
    $tr->commit ();
    return true;
} catch (\Exception $e) {
    $tr->rollBack ();
    return false;
}

이상은 간단한 사무입니다.내 프로젝트에서 한 업무에서 다른 방법을 사용한다. 이 방법에도 업무 조작이 있기 때문에 처음에 모든 조작을 한 업무에 쓰려고 했지만 코드가 너무 비대하고 중용성도 낮기 때문에 업무 플러그인을 사용하는 것을 고려한다.그러나 MYSQL 자체의 업무는 플러그인을 지원하지 않기 때문에 일부러 ii2를 찾아봤다.0 은 사무 플러그인을 지원하기 때문에 쓰기 시작합니다
public function UserInfoDelete()
{
    //     
    $tr = Yii::$app->db->beginTransaction();
    try {
        if($this->delete() == false){
            throw new \Exception(json_encode ($this->getErrors ()));
        }
        $model = new CustomerForm();
        $model =  $model->findOne('11');
        $res = $model->UserInfoDelete();  //       
        // if($res){
        //     throw new \Exception('      '));
        // }
        $userInfo_model = new UserInfoForm();
        $count = $userInfo_model->find()->where(['deleted'=>0,'source'=>self::tableName(),'relation_id'=>$this->id])->count('*');
        if($count > 0){
            $res = $userInfo_model->updateAll(['deleted'=>'1'],['deleted'=>0,'source'=>self::tableName(),'relation_id'=>$this->id]);
            if($res == true){
                throw new \Exception(json_encode ($userInfo_model->getErrors ()));
            }
        }
        $tr->commit ();
    } catch (\Exception $e) {
        $tr->rollBack ();
    }
}
public function UserInfoDelete()
{
    //     
    $tr = Yii::$app->db->beginTransaction();
    try {
        if($this->delete() == false){
            throw new \Exception(json_encode ($this->getErrors ()));
        }
        $userInfo_model = new UserInfoForm();
        $count = $userInfo_model->find()->where(['deleted'=>0,'source'=>self::tableName(),'relation_id'=>$this->id])->count('*');
        if($count > 0) {
            $res = $userInfo_model->updateAll(['deleted' => '1'], ['source' => self::tableName(), 'relation_id' => $this->id]);
            if ($res == false) {
                throw new \Exception(json_encode($userInfo_model->getErrors()));
            }
        }
        $tr->commit ();
        // return true;
    } catch (\Exception $e) {
        $tr->rollBack ();
        // return false;
    }
}

이상은 두 가지 사무이다. 외부 사무에서 한 가지 방법을 사용한다. 이 방법 안에 또 하나의 사무(내부 사무)가 있다. 그리고 내부 사무가 이상을 던진 후에 외부 사무가 계속 집행되는 것을 발견한다. 즉, 외부 사무가 내부 사무가 던진 이상을 포착하지 못하는 것이다.두 가지 업무는 서로 관련이 없다. 어떤 장면에서 이런 업무를 끼워 넣어야 할 수도 있다. 그러나 이것은 나의 현재 수요에 부합되지 않는다. 그리고 매우 둔하고 간단한 방법을 생각해 냈다. 내부 업무return false/true, 외부 업무에서 판단을 하고 스크롤 작업 여부를 결정한다. 그러면 외부 업무는 내부 업무의 영향을 받는다.
 
https://music.163.com/#/song?id=368920좋아하는 음악을 추천합니다.같은 맛의 원숭이를 찾길 바란다.

좋은 웹페이지 즐겨찾기