* @ingroup Database
*/
interface IDatabase {
+ /* Constants to onTransactionResolution() callbacks */
+ const TRIGGER_IDLE = 1;
+ const TRIGGER_COMMIT = 2;
+ const TRIGGER_ROLLBACK = 3;
+
/**
* A string describing the current software version, and possibly
* other details in a user-friendly way. Will be listed on Special:Version, etc.
public function getMasterPos();
/**
- * Run an anonymous function as soon as there is no transaction pending.
+ * @return bool Whether the DB is marked as read-only server-side
+ * @since 1.28
+ */
+ public function serverIsReadOnly();
+
+ /**
+ * Run a callback as soon as the current transaction commits or rolls back.
+ * An error is thrown if no transaction is pending. Queries in the function will run in
+ * AUTO-COMMIT mode unless there are begin() calls. Callbacks must commit any transactions
+ * that they begin.
+ *
+ * This is useful for combining cooperative locks and DB transactions.
+ *
+ * The callback takes one argument:
+ * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_ROLLBACK)
+ *
+ * @param callable $callback
+ * @return mixed
+ * @since 1.28
+ */
+ public function onTransactionResolution( callable $callback );
+
+ /**
+ * Run a callback as soon as there is no transaction pending.
* If there is a transaction and it is rolled back, then the callback is cancelled.
* Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
* Callbacks must commit any transactions that they begin.
*
* Updates will execute in the order they were enqueued.
*
+ * The callback takes one argument:
+ * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_IDLE)
+ *
* @param callable $callback
* @since 1.20
*/
- public function onTransactionIdle( $callback );
+ public function onTransactionIdle( callable $callback );
/**
- * Run an anonymous function before the current transaction commits or now if there is none.
+ * Run a callback before the current transaction commits or now if there is none.
* If there is a transaction and it is rolled back, then the callback is cancelled.
- * Callbacks must not start nor commit any transactions.
+ * Callbacks must not start nor commit any transactions. If no transaction is active,
+ * then a transaction will wrap the callback.
*
* This is useful for updates that easily cause deadlocks if locks are held too long
* but where atomicity is strongly desired for these updates and some related updates.
* @param callable $callback
* @since 1.22
*/
- public function onTransactionPreCommitOrIdle( $callback );
+ public function onTransactionPreCommitOrIdle( callable $callback );
/**
* Begin an atomic section of statements