From: skodak Date: Fri, 12 Jun 2009 10:59:28 +0000 (+0000) Subject: MDL-19470 detection of unfinished transactions and transactions interrupted by exceptions X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=1fbdf76ddb6c01557d1aca49102af0538599230b;p=moodle.git MDL-19470 detection of unfinished transactions and transactions interrupted by exceptions --- diff --git a/lib/dml/moodle_database.php b/lib/dml/moodle_database.php index 668ec4bf3d..3f4f2c3514 100644 --- a/lib/dml/moodle_database.php +++ b/lib/dml/moodle_database.php @@ -278,7 +278,8 @@ abstract class moodle_database { */ public function dispose() { if ($this->intransaction) { - error_log('Active database transaction detected when disposing database!'); // probably can not write to console anymore, log problem instead + // unfortunately we can not access global $CFG any more and can not print debug + error_log('Active database transaction detected when disposing database!'); } if ($this->used_for_db_sessions) { // this is needed because we need to save session to db before closing it diff --git a/lib/setuplib.php b/lib/setuplib.php index 275aa8f08d..eb8e893529 100644 --- a/lib/setuplib.php +++ b/lib/setuplib.php @@ -119,7 +119,17 @@ class invalid_state_exception extends moodle_exception { * Default exception handler, uncought exceptions are equivalent to using print_error() */ function default_exception_handler($ex) { - global $CFG; + global $CFG, $DB, $SCRIPT; + + // detect active db transactions, rollback and log as error + if ($DB->is_transaction_started()) { + error_log('Database transaction aborted by exception in '.$CFG->dirroot.$SCRIPT); + try { + // note: transaction blocks should never change current $_SESSION + $DB->rollback_sql(); + } catch (Exception $ignored) { + } + } $backtrace = $ex->getTrace(); $place = array('file'=>$ex->getFile(), 'line'=>$ex->getLine(), 'exception'=>get_class($ex));