2017-07-10 2 views
1

を実践し、私は、この典型的なコードMySQLの取引が

$this->db->trans_begin(); 

$this->db->query('WRITE TO TABLE A'); 
$this->db->query('WRITE TO TABLE B'); 
$this->db->query('WRITE TO TABLE c'); 
$this->db->query('WRITE TO TABLE D'); 
$this->db->query('WRITE TO TABLE E'); 

if ($this->db->trans_status() === FALSE) 
{ 
     $this->db->trans_rollback(); 
} 
else 
{ 
     $this->db->trans_commit(); 
} 

との取引のチュートリアルと、すべてのカップルの例を見てきましたしかし、私はそれらの間にいくつかのブロックの状態を行う必要があります。 このような記述が可能ですか?

$this->db->trans_begin(); 

$this->db->query('WRITE TO TABLE A'); 

if(some_condition){  
    $this->db->query('WRITE TO TABLE B'); 
} 

$this->db->query('WRITE TO TABLE c'); 

if(some_other_condition){ 
//Do some operations or calculations here and then write to database 
    $this->db->query('WRITE TO TABLE D'); 
} 

$this->db->query('WRITE TO TABLE E'); 

if ($this->db->trans_status() === FALSE) 
{ 
     $this->db->trans_rollback(); 
} 
else 
{ 
     $this->db->trans_commit(); 
} 

これは可能ですか?

+0

はい、条件を記述できます。 –

答えて

0

はいデータベーストランザクションの間に条件を記述できます。詳細については、documentation-here

をご確認ください。また、エラーログを使用し、それぞれのクエリの後にクエリ実行のアイデアを得るために使用することをお勧めします。データベーストランザクションで何が起きているのか分かります。

あなたはこれについての詳細を探検したいなら、あなたもこれを試すことができます:私は

  • 、CIの「手動トランザクション」モードを使用しています

    try { 
        $this->db->trans_begin(); 
        $res = $this->db->query('AN SQL QUERY...'); 
        if(!$res) throw new Exception($this->db->_error_message(), $this->db->_error_number()); 
        $res = $this->db->query('ANOTHER QUERY...'); 
        if(!$res) throw new Exception($this->db->_error_message(), $this->db->_error_number()); 
        $this->db->trans_commit(); 
    } 
    catch (Exception $e) { 
        $this->db->trans_rollback(); 
        log_message('error', sprintf('%s : %s : DB transaction failed. Error no: %s, Error msg:%s, Last query: %s', __CLASS__, __FUNCTION__, $e->getCode(), $e->getMessage(), print_r($this->main_db->last_query(), TRUE))); 
    } 
    

    してくださいません

    1. こと私は$this->db->_error_message()$this->db->_error_number()と呼ぶ必要があります。なぜなら、それはcatchブロックで空の応答を返したからです。 このようにして、詳細なエラー処理を実現できますが、わかりにくいです。