ACID Properties in DBMS در SQL Server
ACID در پایگاه داده
اصطلاح "ACID" در پایگاهدادههای SQL به مجموعهای از ویژگیها اشاره دارد که اطمینان حاصل میکنند تراکنشهای دیتابیسی بهطور ایمن و قابل اعتماد اجرا میشوند. ACID مخفف چهار ویژگی است: Atomicity (اتمی بودن)، Consistency (انسجام)، Isolation (انزوا)، و Durability (پایداری).
1. Atomicity (اتمی بودن):
اتمی بودن به این معناست که یک تراکنش دیتابیسی باید یا بهطور کامل انجام شود یا اصلاً انجام نشود. این ویژگی اطمینان میدهد که در صورتی که هر بخشی از تراکنش با شکست مواجه شود، هیچ یک از تغییرات اعمال نمیشود.
مثال: فرض کنید دو حساب بانکی داریم و میخواهیم مبلغی را از حساب A به حساب B انتقال دهیم. تراکنش شامل دو مرحله است: کم کردن مبلغ از حساب A و افزودن آن به حساب B. اگر کم کردن مبلغ از حساب A موفقیتآمیز باشد ولی افزودن آن به حساب B با شکست مواجه شود، باید عملیات به حالت اولیه برگردد، تا از هرگونه عدم توازن جلوگیری شود.
2. Consistency (انسجام):
انسجام تضمین میکند که تراکنشها پایگاه داده را از یک وضعیت معتبر به وضعیت معتبر دیگری منتقل میکنند، و هر تراکنش قوانین و محدودیتهای تعریف شده برای پایگاه داده را رعایت میکند.
مثال: در همان مثال انتقال پول، اگر قوانین پایگاه داده بگویند که موجودی حساب نباید منفی شود، باید اطمینان حاصل شود که هیچ تراکنشی نمیتواند موجودی حساب را به مقدار منفی برساند.
3. Isolation (انزوا):
انزوا تضمین میکند که اجرای همزمان تراکنشها در پایگاه داده بدون تداخل و تأثیر بر یکدیگر صورت میگیرد. یعنی نتایج اجرای تراکنشها به گونهای هستند که گویی تراکنشها به صورت ترتیبی و جداگانه اجرا شدهاند.
مثال: اگر دو نفر بهطور همزمان قصد داشته باشند مبلغی را از حسابی برداشت کنند که موجودی آن کافی نیست، انزوا تضمین میکند که یکی از این تراکنشها ابتدا تکمیل میشود و سپس تراکنش دیگر انجام میشود، تا موجودی منفی یا نتایج غیرمطلوب دیگر ایجاد نشود.
4. Durability (پایداری):
پایداری تضمین میکند که نتایج یک تراکنش موفقیتآمیز حتی در صورت وقوع نقصهای سیستم (مانند قطعی برق یا خرابیهای سختافزاری) بهطور دائمی در پایگاه داده باقی میمانند.
مثال: پس از انتقال موفقیتآمیز پول از حساب A به حساب B، حتی اگر بلافاصله پس از اتمام تراکنش سیستم دچار خرابی شود، تغییرات باید بهطور دائمی ذخیره شده و از دست نروند. این ویژگیها با هم تضمین میکنند که عملیات دیتابیسی بهطور قابل اعتماد و امن انجام میشوند و اطلاعات پایگاه داده همواره در یک وضعیت سازگار و معتبر باقی میماند.
نمونه ACID با کد SQL Server
برای مثال، یک سناریو ساده از یک بانک را در نظر بگیرید که شامل دو جدول است:
جدول Accounts (حسابها): این جدول شامل ستونهای AccountID (شناسه حساب) و Balance (موجودی) است.
جدول Transactions (تراکنشها): این جدول شامل ستونهای TransactionID (شناسه تراکنش)، AccountID (شناسه حساب) و Amount (مقدار تراکنش) است.
حالا فرض کنید میخواهیم مبلغ 100 واحد را از حساب A به حساب B انتقال دهیم. این عملیات شامل چندین مرحله میشود:
بررسی موجودی کافی در حساب A.
کم کردن 100 واحد از حساب A.
افزودن 100 واحد به حساب B.
ثبت تراکنش در جدول Transactions.
برای اجرای این عملیات به صورت اتمی، میتوان از یک تراکنش در SQL استفاده کرد. مثال زیر نشان میدهد که چگونه این عملیات را میتوان در قالب یک کوئری SQL انجام داد:
SQL Transaction Example
BEGIN TRANSACTION;
IF (SELECT Balance FROM Accounts WHERE AccountID = 'A') >= 100
BEGIN
UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 'A';
UPDATE Accounts
SET Balance = Balance + 100
WHERE AccountID = 'B';
INSERT INTO Transactions (TransactionID, AccountID, Amount)
VALUES (NEWID(), 'A', -100), (NEWID(), 'B', 100);
COMMIT;
END
ELSE
BEGIN
ROLLBACK;
END
در این مثال:
Atomicity (اتمی بودن): با استفاده از تراکنش (BEGIN TRANSACTION و COMMIT یا ROLLBACK)، اطمینان حاصل میشود که تمامی مراحل انتقال پول یا بهطور کامل انجام میشوند یا در صورت بروز هر گونه خطا یا شرطی که برآورده نشود، به حالت اولیه برگردانده میشوند.
Consistency (انسجام): عملیات بررسی موجودی حساب A قبل از برداشت، تضمین میکند که پایگاه داده در حالت سازگار باقی بماند و قوانین تعریف شده رعایت شوند (مثلاً موجودی حساب نمیتواند منفی باشد).
Isolation (انزوا): تراکنشها به صورت مستقل اجرا میشوند. اگر چندین تراکنش همزمان انجام شوند، SQL Server (یا هر سیستم مدیریت پایگاه داده دیگر) با استفاده از مکانیزمهای قفلگذاری و برنامهریزی، انزوا را تضمین میکند.
Durability (پایداری): پس از انجام تراکنش و تأیید آن (COMMIT)، تغییرات بهطور دائمی ذخیره میشوند. حتی اگر سیستم بلافاصله پس از COMMIT خاموش شود، این تغییرات از بین نمیروند. این مثال نشاندهندهی نحوه استفاده از ویژگیهای ACID در یک کوئری SQL برای اطمینان از اجرای ایمن و قابل اعتماد عملیات انتقال وجه است.