2017-07-10 2 views
1

Ich habe ein paar Beispiele für Transaktions Tutorial und alle mit diesem typischen Code gesehenMysql Transaktionen praktiziert

$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(); 
} 

Aber ich brauche zwischen ihnen etwas Block Zustand zu tun. Ist es möglich so etwas zu schreiben?

$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(); 
} 

Ist das möglich?

+0

Ja, Sie können eine Bedingung schreiben. –

Antwort

0

Ja Sie können eine Bedingung zwischen der Datenbanktransaktion schreiben. Für mehr Details sollten Sie die documentation-here

überprüfen Ich werde Ihnen auch vorschlagen, dass Sie Fehlerprotokoll verwenden und auch $this->db->last_query(); Nach jeder Abfrage verwenden, um die Idee der Abfrageausführung zu bekommen. Es wird ausreichen, um zu erfahren, was mit der Datenbanktransaktion passiert.

Wenn Sie mehr über diese erkunden wollen, dann können Sie versuchen, diese auch:

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))); 
} 

Bitte nicht, dass

  1. ich die „manuelle Transaktion“ -Modus von CI verwenden,
  2. Ich muss $this->db->_error_message(), $this->db->_error_number() nach jeder Abfrage aufrufen, weil es eine leere Antwort im catch-Block zurückgegeben hat. Nur so kann ich die detaillierte Fehlerbehandlung erreichen, aber ich finde es klobig.
Verwandte Themen