aeatech/transaction-manager-common-transactions
Shared transaction definitions and utilities for AeaTech Transaction Manager. Centralizes common transaction types, payload structures, and helper classes used across services/packages to keep implementations consistent and reusable.
Installation
composer require aeatech/transaction-manager-common-transactions
Ensure your project uses Laravel 8+ (or compatible) and PHP 8.0+.
Basic Usage Import the transaction classes in your service or repository:
use AEATech\TransactionManager\CommonTransactions\Transaction\BaseTransaction;
use AEATech\TransactionManager\CommonTransactions\Transaction\TransactionBuilder;
First Use Case: Simple Transaction
$transaction = TransactionBuilder::create()
->addQuery('INSERT INTO users (name, email) VALUES (?, ?)', ['John Doe', 'john@example.com'])
->addQuery('UPDATE accounts SET balance = balance - 100 WHERE user_id = ?', [1])
->build();
$result = $transaction->execute($connection);
TransactionBuilder: Core class for constructing transactions.BaseTransaction: Abstract class defining the transaction interface.TransactionResult: Class for handling execution outcomes (success/failure).Query Chaining
Use addQuery() to chain SQL operations atomically:
$transaction = TransactionBuilder::create()
->addQuery('BEGIN TRANSACTION;')
->addQuery('INSERT INTO orders (user_id, amount) VALUES (?, ?)', [$userId, $amount])
->addQuery('UPDATE users SET balance = balance - ? WHERE id = ?', [$amount, $userId])
->addQuery('COMMIT;')
->build();
Parameterized Queries
Always use placeholders (?) for security:
$transaction->addQuery('DELETE FROM temp_data WHERE created_at < ?', [$cutoffDate]);
Laravel Eloquent Integration
Use DB::transaction() as a wrapper:
DB::transaction(function () use ($transaction) {
$transaction->execute($this->connection);
});
Custom Dialect Support
Extend BaseTransaction for dialect-specific syntax (e.g., BEGIN TRANSACTION vs. START TRANSACTION):
class MySQLTransaction extends BaseTransaction {
public function getStartQuery(): string {
return 'START TRANSACTION';
}
}
Error Handling
Catch TransactionException for rollback logic:
try {
$transaction->execute($connection);
} catch (TransactionException $e) {
Log::error('Transaction failed: ' . $e->getMessage());
// Retry or notify admin
}
Connection Leaks Ensure transactions are always committed/rolled back:
// ❌ Avoid implicit commits (e.g., via Eloquent outside transaction)
User::create(['name' => 'Test']); // May commit early!
Nested Transactions
This package does not support nested transactions by default. Use a dialect-specific adapter (e.g., pdo_mysql) if needed.
Parameter Binding
Incorrect binding (e.g., mixing ? with named placeholders) may cause SQL errors:
// ❌ Fails if dialect expects `?` placeholders
$transaction->addQuery('SELECT * FROM users WHERE id = :id', ['id' => 1]);
Log Queries Enable Laravel’s query logging to inspect transaction SQL:
DB::enableQueryLog();
$transaction->execute($connection);
dd(DB::getQueryLog());
Check Transaction Status
Implement a isActive() method in your dialect class to verify transaction state.
Custom Transaction Classes
Extend BaseTransaction to add pre/post-execution hooks:
class AuditTransaction extends BaseTransaction {
public function execute(Connection $connection) {
$this->logStart($connection);
parent::execute($connection);
$this->logEnd($connection);
}
}
Dialect-Specific Adapters
Override getStartQuery(), getCommitQuery(), and getRollbackQuery() for non-standard SQL dialects.
Retry Logic
Add a retry() method to handle transient failures:
public function execute(Connection $connection, int $retries = 3) {
try {
parent::execute($connection);
} catch (Exception $e) {
if ($retries > 0) {
sleep(1);
$this->execute($connection, $retries - 1);
}
throw $e;
}
}
'default' => [
'driver' => 'mysql',
'transactions' => [
'isolation_level' => 'serializable',
],
],
How can I help you explore Laravel packages today?