MDL-29198 DB - make delete_records transactional safe when needed

This commit is contained in:
Eloy Lafuente (stronk7)
2011-09-01 11:08:09 +02:00
parent ddf322586e
commit 7a8a938077
2 changed files with 22 additions and 1 deletions
+3 -1
View File
@@ -1595,7 +1595,9 @@ abstract class moodle_database {
* @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);
+19
View File
@@ -3851,6 +3851,25 @@ class dml_test extends UnitTestCase {
$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();
}