/**
* Abstract base class for update jobs that do something with some secondary
* data extracted from article.
- *
- * @note subclasses should NOT start or commit transactions in their doUpdate() method,
- * a transaction will automatically be wrapped around the update. If need be,
- * subclasses can override the beginTransaction() and commitTransaction() methods.
*/
abstract class DataUpdate implements DeferrableUpdate {
/** @var mixed Result from LBFactory::getEmptyTransactionTicket() */
$this->ticket = $ticket;
}
- /**
- * Begin an appropriate transaction, if any.
- * This default implementation does nothing.
- */
- public function beginTransaction() {
- // noop
- }
-
- /**
- * Commit the transaction started via beginTransaction, if any.
- * This default implementation does nothing.
- */
- public function commitTransaction() {
- // noop
- }
-
- /**
- * Abort / roll back the transaction started via beginTransaction, if any.
- * This default implementation does nothing.
- */
- public function rollbackTransaction() {
- // noop
- }
-
/**
* Convenience method, calls doUpdate() on every DataUpdate in the array.
*
$updates = self::enqueueUpdates( $updates );
}
- if ( !count( $updates ) ) {
- return; // nothing to do
- }
-
- $open_transactions = [];
- $exception = null;
-
- try {
- // begin transactions
- foreach ( $updates as $update ) {
- $update->beginTransaction();
- $open_transactions[] = $update;
- }
-
- // do work
- foreach ( $updates as $update ) {
- $update->doUpdate();
- }
-
- // commit transactions
- while ( count( $open_transactions ) > 0 ) {
- $trans = array_pop( $open_transactions );
- $trans->commitTransaction();
- }
- } catch ( Exception $ex ) {
- $exception = $ex;
- wfDebug( "Caught exception, will rethrow after rollback: " .
- $ex->getMessage() . "\n" );
- }
-
- // rollback remaining transactions
- while ( count( $open_transactions ) > 0 ) {
- $trans = array_pop( $open_transactions );
- $trans->rollbackTransaction();
- }
-
- if ( $exception ) {
- throw $exception; // rethrow after cleanup
+ foreach ( $updates as $update ) {
+ $update->doUpdate();
}
}
*/
/**
- * Abstract base class for update jobs that put some secondary data extracted
- * from article content into the database.
- *
- * @note subclasses should NOT start or commit transactions in their doUpdate() method,
- * a transaction will automatically be wrapped around the update. Starting another
- * one would break the outer transaction bracket. If need be, subclasses can override
- * the beginTransaction() and commitTransaction() methods.
- *
* @deprecated Since 1.28 Use DataUpdate directly, injecting the database
*/
abstract class SqlDataUpdate extends DataUpdate {
/** @var IDatabase Database connection reference */
protected $mDb;
-
/** @var array SELECT options to be used (array) */
protected $mOptions = [];
- /** @var bool Whether a transaction is open on this object (internal use only!) */
- private $mHasTransaction;
-
- /** @var bool Whether this update should be wrapped in a transaction */
- protected $mUseTransaction;
-
- /**
- * Constructor
- *
- * @param bool $withTransaction Whether this update should be wrapped in a
- * transaction (default: true). A transaction is only started if no
- * transaction is already in progress, see beginTransaction() for details.
- */
- public function __construct( $withTransaction = true ) {
+ public function __construct() {
parent::__construct();
$this->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;
- }
}
}