mDb = wfGetLB()->getLazyConnectionRef( DB_MASTER ); $this->mWithTransaction = $withTransaction; $this->mHasTransaction = false; } /** * Begin a database transaction, if $withTransaction was given as true in * the constructor for this SqlDataUpdate. * * Because nested transactions are not supported by the Database class, * this implementation checks Database::trxLevel() and only opens a * transaction if none is already active. */ public function beginTransaction() { if ( !$this->mWithTransaction ) { return; } // NOTE: nested transactions are not supported, only start a transaction if none is open if ( $this->mDb->trxLevel() === 0 ) { $this->mDb->begin( get_class( $this ) . '::beginTransaction' ); $this->mHasTransaction = true; } } /** * Commit the database transaction started via beginTransaction (if any). */ public function commitTransaction() { if ( $this->mHasTransaction ) { $this->mDb->commit( get_class( $this ) . '::commitTransaction' ); $this->mHasTransaction = false; } } /** * Abort the database transaction started via beginTransaction (if any). */ public function abortTransaction() { if ( $this->mHasTransaction ) { // XXX: actually... maybe always? $this->mDb->rollback( get_class( $this ) . '::abortTransaction' ); $this->mHasTransaction = false; } } /** * Invalidate the cache of a list of pages from a single namespace. * This is intended for use by subclasses. * * @param int $namespace Namespace number * @param array $dbkeys */ protected function invalidatePages( $namespace, array $dbkeys ) { if ( $dbkeys === [] ) { return; } $dbw = $this->mDb; $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $namespace, $dbkeys ) { /** * Determine which pages need to be updated * This is necessary to prevent the job queue from smashing the DB with * large numbers of concurrent invalidations of the same page */ $now = $dbw->timestamp(); $ids = $dbw->selectFieldValues( 'page', 'page_id', [ 'page_namespace' => $namespace, 'page_title' => $dbkeys, 'page_touched < ' . $dbw->addQuotes( $now ) ], __METHOD__ ); if ( $ids === [] ) { return; } /** * Do the update * We still need the page_touched condition, in case the row has changed since * the non-locking select above. */ $dbw->update( 'page', [ 'page_touched' => $now ], [ 'page_id' => $ids, 'page_touched < ' . $dbw->addQuotes( $now ) ], __METHOD__ ); } ); } }