MDL-29198 DB - make delete_records transactional safe when needed
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user