Setelah kita membuat trigger di Yii kita harus bisa memastikan bahwa kedua tabel tersebut diupdate secara akurat. Artinya jika tabel yang satu berhasil diupdate, maka tabel lain juga harus berhasil. Jika satu tabel gagal diupdate, yang lain juga harus gagal diupdate. Singkat kata jika gagal harus gagal semua, jika berhasil harus berhasil semua. Jika ada tabel yang berhasil dan dan ada tabel yang gagal maka data menjadi tidak konsisten. Untuk melaksanakan hal ini maka bisa dilakukan dengan transaction.

Transaction ini akan kita letakkan di actionCreate, actionUpdate, dan actionDelete di controllers/UserGroupController.php.

Dalam actionCreate silahkan disesuaikan seperti contoh berikut ini:
    public function actionCreate($user_id)
    {
        $model=new UserGroup;
        $model->user_id=(int)$user_id;

        if(isset($_POST[‘UserGroup’]))
        {
            $model->attributes=$_POST[‘UserGroup’];

            $trx=$model->dbConnection->beginTransaction();
            //atau $trx=Yii::app()->db->beginTransaction();
            try
            {
                if ($model->save())
                {
                    $trx->commit();
                    Yii::app()->user->setFlash(“pesan”,”Add Success”);
                     $this->redirect(array(‘view’,’id’=>$model->user_group_id));
                }
            }
            catch(Exception $e)
            {
               Yii::app()->user->setFlash(“pesan”,”ERROR: “.$e->getMessage());
               $trx->rollback();
            }

        }

        $this->render(‘create’,array(
            ‘model’=>$model,
        ));
    }

Untuk actionUpdate:
    public function actionUpdate($id)
    {
        $model=$this->loadModel($id);

        if(isset($_POST[‘UserGroup’]))
        {
            $model->attributes=$_POST[‘UserGroup’];

            $trx=$model->dbConnection->beginTransaction();
            try
            {
                $model->save();
                $trx->commit();
                $this->redirect(array(‘view’,’id’=>$model->user_group_id));
            }
            catch(Exception $e)
            {
               $trx->rollback();
            }

        }

        $this->render(‘update’,array(
            ‘model’=>$model,
        ));
    }

Untuk actionDelete:
    public function actionDelete($id)
    {
        if(Yii::app()->request->isPostRequest)
        {
            $model=$this->loadModel($id);
            $trx=$model->dbConnection->beginTransaction();
            try
            {
                $model->delete();
                $trx->commit();
                if(!isset($_GET[‘ajax’]))
                $this->redirect(isset($_POST[‘returnUrl’]) ? $_POST[‘returnUrl’] : array(‘admin’));
            }
            catch(Exception $e)
            {
               $trx->rollback();
            }
        }
        else
            throw new CHttpException(400,’Invalid request. Please do not repeat this request again.’);
    }

Jika kita pada function tertentu kita ingin memastikan bahwa harus ada transaction, kita data menggunakan function dbConnection->getCurrentTransaction() .

Kunjungi www.proweb.co.id untuk menambah wawasan anda.

Transaction di Yii