بخش نهم - Transactions
تراکنشها یا Transactionها برای انجام چندین عملیات پایگاه داده به صورت یکجا استفاده میشوند. به عبارت دیگر، اگر همه عملیات موفق باشند، تغییرات به پایگاه داده اعمال میشود، اما اگر یکی از عملیاتها با خطا مواجه شود، تمامی تغییرات لغو میشوند (rollback).
این موضوع به ویژه برای اطمینان از یکپارچگی دادهها در سناریوهایی که شامل چندین عملیات هستند مفید است، مانند ثبت چند جدول همزمان، مدیریت تراکنشهای بانکی و غیره.
لاراول برای مدیریت تراکنشها متدهایی را فراهم میکند که در فساد DB قرار دارند.
متد ها عبارتند از:
1- متد beginTransaction برای شروع یک تراکنش.
2- متد commit برای تأیید و ثبت تراکنش.
3- متد rollBack برای لغو تغییرات در صورت بروز خطا.
4- متد afterCommit برای انجام عملیات پس از commit.
مثال:
try {
DB::beginTransaction();
DB::table('users')->insert([
'name' => 'John',
'email' => 'john@example.com',
'password' => bcrypt('1234')
]);
DB::table('profiles')->insert([
'user_id' => 1,
'bio' => 'Test Bio',
'age' => 25
]);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
echo "Error: " . $e->getMessage();
}در ابتدا تراکنش با beginTransaction آغاز میشود.
دو عملیات insert در جدولهای مختلف انجام میشود.
اگر همه عملیات بدون خطا انجام شوند، با commit تغییرات ثبت میشود.
اگر خطا رخ دهد (مانند ارور در هر یک از عملیات)، با استفاده از catch خطا مدیریت شده و rollBack فراخوانی میشود تا تغییرات لغو شود.
لاراول همچنین یک متد سادهتر و قابل خواندنتر به نام transaction ارائه میدهد که میتوان کل تراکنش را در یک Closure قرار داد:
مثال:
DB::transaction(function () {
DB::table('users')->insert([
'name' => 'John',
'email' => 'john@example.com',
'password' => bcrypt('1234')
]);
DB::table('profiles')->insert([
'user_id' => 2,
'bio' => 'Test Bio',
'age' => 30
]);
})اگر کد داخل transaction موفق باشد، تغییرات به صورت خودکار ذخیره (commit) میشود.
در صورت بروز خطا، تغییرات به صورت خودکار لغو (rollback) میشوند.
این متد علاوه بر اجرای کد در قالب تراکنش، تعداد دفعاتی که باید در صورت مواجهه با خطا مجدد تلاش کند را میپذیرد. این ویژگی برای مواقعی که با عملیاتهای رقابتی روبرو هستید (مانند lockها یا عملیات با احتمال تعارض) مفید است.
DB::transaction(function () {
//
}, 3)متد afterCommit به شما امکان میدهد که یک callback یا عملیات خاص را پس از موفقیتآمیز بودن commit اجرا کنید. برای مثال، میتوانید پس از ذخیره تغییرات، رویدادهایی مثل ارسال ایمیل را انجام دهید.
DB::afterCommit(function () {
echo "Success";
});میتوانید از پارامترهایی برای کنترل تراکنش استفاده کنید. به عنوان مثال، تنظیم چندین تراکنش تو در تو (nested transactions) نیز در لاراول امکانپذیر است.
تراکنشها در سناریوهایی مانند عملیات مالی، مدیریت سفارشات یا عملیاتهای مربوط به موجودی کالا اهمیت زیادی دارند. با استفاده از آنها میتوانید از ناسازگاری دادهها و بروز اشکالات جدی در پایگاه داده جلوگیری کنید.
به طور خلاصه، تراکنشها در لاراول به شما امکان میدهند عملیات مختلف پایگاه داده را به صورت امن انجام دهید، به طوری که در صورت بروز خطا همه تغییرات برگردانده شود.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.