private $callback;
/**
- * @param IDatabase $dbw
+ * @param IDatabase $dbw DB handle; update aborts if a transaction now this rolls back
* @param string $fname Caller name (usually __METHOD__)
* @param callable $callback
+ * @param IDatabase[] $conns Abort if a transaction now on one of these rolls back [optional]
* @see IDatabase::doAtomicSection()
*/
- public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+ public function __construct( IDatabase $dbw, $fname, callable $callback, array $conns = [] ) {
$this->dbw = $dbw;
$this->fname = $fname;
$this->callback = $callback;
-
- if ( $this->dbw->trxLevel() ) {
- $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ // Register DB connections for which uncommitted changes are related to this update
+ $conns[] = $dbw;
+ foreach ( $conns as $conn ) {
+ if ( $conn->trxLevel() ) {
+ $conn->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ }
}
}
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
private $callback;
/**
- * @param IDatabase $dbw
+ * @param IDatabase $dbw DB handle; update aborts if a transaction now this rolls back
* @param string $fname Caller name (usually __METHOD__)
* @param callable $callback Callback that takes (IDatabase, method name string)
+ * @param IDatabase[] $conns Abort if a transaction now on one of these rolls back [optional]
*/
- public function __construct( IDatabase $dbw, $fname, callable $callback ) {
+ public function __construct( IDatabase $dbw, $fname, callable $callback, array $conns = [] ) {
$this->dbw = $dbw;
$this->fname = $fname;
$this->callback = $callback;
-
- if ( $this->dbw->trxLevel() ) {
- $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ // Register DB connections for which uncommitted changes are related to this update
+ $conns[] = $dbw;
+ foreach ( $conns as $conn ) {
+ if ( $conn->trxLevel() ) {
+ $conn->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
+ }
}
}
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
}
}
+ /**
+ * @private This method is public so that it works with onTransactionResolution()
+ * @param int $trigger
+ */
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;