/**
* Set up all member variables using a database query.
- * @param int $mode
+ * @param int $mode One of (Category::LOAD_ONLY, Category::LAZY_INIT_ROW)
* @throws MWException
* @return bool True on success, false on failure.
*/
* fields are null, the resulting Category object will represent an empty
* category if a title object was given. If the fields are null and no
* title was given, this method fails and returns false.
- * @param Title $title Optional title object for the category represented by
+ * @param Title|null $title Optional title object for the category represented by
* the given row. May be provided if it is already known, to avoid having
* to re-create a title object later.
* @return Category|false
$dbw->startAtomic( __METHOD__ );
+ // Lock the `category` row before locking `categorylinks` rows to try
+ // to avoid deadlocks with LinksDeletionUpdate (T195397)
+ $dbw->lockForUpdate( 'category', [ 'cat_title' => $this->mName ], __METHOD__ );
+
// Lock all the `categorylinks` records and gaps for this category;
// this is a separate query due to postgres/oracle limitations
$dbw->selectRowCount(