MDL-19470 detection of unfinished transactions and transactions interrupted by exceptions

This commit is contained in:
skodak 2009-06-12 10:59:28 +00:00
parent 18e8f3ab9e
commit 1fbdf76ddb
2 changed files with 13 additions and 2 deletions

View File

@ -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

View File

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