class DatabaseTransactionsManager extends DatabaseTransactionsManager

Testing-aware transaction manager that properly handles RefreshDatabase's wrapper transaction.

When RefreshDatabase wraps tests in a transaction, this manager ensures that afterCommit callbacks execute at the appropriate time (when returning to the wrapper level) rather than waiting for level 0 which never happens during wrapped tests.

Constants

protected COMMITTED_CONTEXT_KEY

protected PENDING_CONTEXT_KEY

protected CURRENT_CONTEXT_KEY

Properties

protected array<int, null|string> $connectionsTransacting

The names of the connections transacting during tests.

Methods

getCommittedTransactionsInternal()

Get all committed transactions for the current coroutine.

void
setCommittedTransactions(Collection $transactions)

Set committed transactions for the current coroutine.

getPendingTransactionsInternal()

Get all pending transactions for the current coroutine.

void
setPendingTransactions(Collection $transactions)

Set pending transactions for the current coroutine.

array
getCurrentTransaction()

Get current transaction map for the current coroutine.

void
setCurrentTransactionForConnection(string $connection, DatabaseTransactionRecord|null $transaction)

Set current transaction for a connection.

getCurrentTransactionForConnection(string $connection)

Get current transaction for a connection.

void
begin(string $connection, int $level)

Start a new database transaction.

commit(string $connection, int $levelBeingCommitted, int $newTransactionLevel)

Commit the root database transaction and execute callbacks.

void
stageTransactions(string $connection, int $levelBeingCommitted)

Move relevant pending transactions to a committed state.

void
rollback(string $connection, int $newTransactionLevel)

Rollback the active database transaction.

void
removeAllTransactionsForConnection(string $connection)

Remove all pending, completed, and current transactions for the given connection name.

removeCommittedTransactionsThatAreChildrenOf(DatabaseTransactionRecord $transaction)

Remove and return all committed descendants of the given transaction.

void
executeRollbackCallbacks(Collection $transactions)

Execute rollback callbacks for every detached transaction.

void
addCallback(callable $callback)

Register a transaction callback.

void
addCallbackForRollback(callable $callback)

Register a callback for transaction rollback.

callbackApplicableTransactions()

Get the transactions that are applicable to callbacks.

bool
afterCommitCallbacksShouldBeExecuted(int $level)

Determine if after commit callbacks should be executed for the given transaction level.

getPendingTransactions()

Get all of the pending transactions.

getCommittedTransactions()

Get all of the committed transactions.

static bool
hasNonCoroutinePendingTransactions()

Check whether there are pending transactions in non-coroutine storage.

static void
copyToNonCoroutineState()

Copy transaction state from the current coroutine to non-coroutine storage.

static void
clearNonCoroutineState()

Clear all transaction state from non-coroutine storage.

__construct(array $connectionsTransacting)

Create a new database transaction manager instance.

Details

protected Collection getCommittedTransactionsInternal()

Get all committed transactions for the current coroutine.

Return Value

Collection

protected void setCommittedTransactions(Collection $transactions)

Set committed transactions for the current coroutine.

Parameters

Collection $transactions

Return Value

void

protected Collection getPendingTransactionsInternal()

Get all pending transactions for the current coroutine.

Return Value

Collection

protected void setPendingTransactions(Collection $transactions)

Set pending transactions for the current coroutine.

Parameters

Collection $transactions

Return Value

void

protected array getCurrentTransaction()

Get current transaction map for the current coroutine.

Return Value

array

protected void setCurrentTransactionForConnection(string $connection, DatabaseTransactionRecord|null $transaction)

Set current transaction for a connection.

Parameters

string $connection
DatabaseTransactionRecord|null $transaction

Return Value

void

protected DatabaseTransactionRecord|null getCurrentTransactionForConnection(string $connection)

Get current transaction for a connection.

Parameters

string $connection

Return Value

DatabaseTransactionRecord|null

void begin(string $connection, int $level)

Start a new database transaction.

Parameters

string $connection
int $level

Return Value

void

Collection commit(string $connection, int $levelBeingCommitted, int $newTransactionLevel)

Commit the root database transaction and execute callbacks.

Parameters

string $connection
int $levelBeingCommitted
int $newTransactionLevel

Return Value

Collection

void stageTransactions(string $connection, int $levelBeingCommitted)

Move relevant pending transactions to a committed state.

Parameters

string $connection
int $levelBeingCommitted

Return Value

void

void rollback(string $connection, int $newTransactionLevel)

Rollback the active database transaction.

Parameters

string $connection
int $newTransactionLevel

Return Value

void

protected void removeAllTransactionsForConnection(string $connection)

Remove all pending, completed, and current transactions for the given connection name.

Parameters

string $connection

Return Value

void

protected Collection removeCommittedTransactionsThatAreChildrenOf(DatabaseTransactionRecord $transaction)

Remove and return all committed descendants of the given transaction.

Parameters

DatabaseTransactionRecord $transaction

Return Value

Collection

protected void executeRollbackCallbacks(Collection $transactions)

Execute rollback callbacks for every detached transaction.

Parameters

Collection $transactions

Return Value

void

at line 42
void addCallback(callable $callback)

Register a transaction callback.

If there are no applicable transactions (only the RefreshDatabase wrapper), the callback executes immediately. Otherwise, it's queued for after commit.

Parameters

callable $callback

Return Value

void

void addCallbackForRollback(callable $callback)

Register a callback for transaction rollback.

Parameters

callable $callback

Return Value

void

at line 63
Collection callbackApplicableTransactions()

Get the transactions that are applicable to callbacks.

Skips the RefreshDatabase wrapper transaction(s) so callbacks are only associated with transactions created within the test itself.

Return Value

Collection

at line 74
bool afterCommitCallbacksShouldBeExecuted(int $level)

Determine if after commit callbacks should be executed for the given transaction level.

Returns true at level 1 (the RefreshDatabase wrapper level) instead of level 0, since the wrapper transaction is never committed during tests.

Parameters

int $level

Return Value

bool

Collection getPendingTransactions()

Get all of the pending transactions.

Return Value

Collection

Collection getCommittedTransactions()

Get all of the committed transactions.

Return Value

Collection

static bool hasNonCoroutinePendingTransactions()

Check whether there are pending transactions in non-coroutine storage.

Return Value

bool

static void copyToNonCoroutineState()

Copy transaction state from the current coroutine to non-coroutine storage.

Tests only. This copies coroutine-local transaction state into worker-global storage, so request-time use can leak or race across concurrent requests.

Return Value

void

static void clearNonCoroutineState()

Clear all transaction state from non-coroutine storage.

Tests only. This mutates worker-global transaction state, so request-time use can race with concurrent requests using the same storage.

Return Value

void

at line 31
__construct(array $connectionsTransacting)

Create a new database transaction manager instance.

Parameters

array $connectionsTransacting