Skip to content

Commit

Permalink
MDL-29198 DB - make delete_records transactional safe when needed
Browse files Browse the repository at this point in the history
  • Loading branch information
stronk7 committed Sep 1, 2011
1 parent 15141ad commit 687e61c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/dml/moodle_database.php
Original file line number Diff line number Diff line change
Expand Up @@ -1575,7 +1575,9 @@ public function record_exists_sql($sql, array $params=null) {
* @throws dml_exception if error
*/
public function delete_records($table, array $conditions=null) {
if (is_null($conditions)) {
// truncate is drop/create (DDL), not transactional safe,
// so we don't use the shortcut within them. MDL-29198
if (is_null($conditions) && empty($this->transactions)) {
return $this->execute("TRUNCATE TABLE {".$table."}");
}
list($select, $params) = $this->where_clause($table, $conditions);
Expand Down
19 changes: 19 additions & 0 deletions lib/dml/simpletest/testdml.php
Original file line number Diff line number Diff line change
Expand Up @@ -3771,6 +3771,25 @@ function test_concurent_transactions() {
$transaction->allow_commit();
$this->assertEqual(2, $DB2->count_records($tablename));

// let's try delete all is also working on (this checks MDL-29198)
// initially both connections see all the records in the table (2)
$this->assertEqual(2, $DB->count_records($tablename));
$this->assertEqual(2, $DB2->count_records($tablename));
$transaction = $DB->start_delegated_transaction();

// delete all from within transaction
$DB->delete_records($tablename);

// transactional $DB, sees 0 records now
$this->assertEqual(0, $DB->count_records($tablename));

// others ($DB2) get no changes yet
$this->assertEqual(2, $DB2->count_records($tablename));

// now commit and we should see changes
$transaction->allow_commit();
$this->assertEqual(0, $DB2->count_records($tablename));

$DB2->dispose();
}

Expand Down

0 comments on commit 687e61c

Please sign in to comment.