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 );
+ }
}
}
try {
/** @var Exception $e */
$e = null;
- call_user_func_array( $this->callback, [ $this->dbw, $this->fname ] );
+ ( $this->callback )( $this->dbw, $this->fname );
} catch ( Exception $e ) {
}
if ( $autoTrx ) {
}
}
+ /**
+ * @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;