درک اتمی: اولین ستون معاملات اسیدی

مقدمه
اگر با پایگاه داده های رابطه ای کار کرده اید ، احتمالاً این اصطلاح را پیدا کرده اید اسید– مخفف مخفف معاملات قابل اعتماد پایگاه داده. هر حرف در اسید معنای و اهمیت عمیقی دارد: اتمیبا ثباتبا انزواوت دوامبشر
در این مقاله ، ما قصد داریم روی ستون اول تمرکز کنیم: اتمیبشر شما می فهمید که این به چه معنی است ، چرا اهمیت دارد و چگونه پایگاه داده ها آن را در داخل اجرا می کنند. این پست شامل یک قیاس در دنیای واقعی ، اجرای SQL و حتی یک دست و پا است Go Simulation of Writ-Ahead (WAL)– پایگاه داده های مکانیسم کلیدی مانند پس از برای تضمین اتمی استفاده کنید.
اگر علاقه مند به غواصی در بقیه خصوصیات اسید هستید ، می توانید کاوش کنید:
بیایید عمیق شویم به:
- اتمی در بانکهای اطلاعاتی چیست؟
- اتمی در عمل: یک بستر دستور العمل مشترک
- چگونه پایگاه داده ها اتمی را تضمین می کنند (زیر کاپوت)
- ورود به سیستم پیش توضیح توضیح داده شده
- شبیه سازی وال در GO
- پایان
اتمی در بانکهای اطلاعاتی چیست؟
برای اهداف تظاهرات ، یک پایگاه داده PostgreSQL را فرض خواهیم کرد. با این حال ، تنها با تغییرات جزئی ، همان اصول و تکنیک ها تقریباً در تمام پایگاه داده های سنتی SQL مانند MySQL ، Mariadb و SQL Server اعمال می شود.
اتمی به این معنی است که گروهی از عملیات در یک معامله به عنوان یک واحد واحد و غیرقابل تفکیک رفتار می شوند. هر یک همه عملیات موفق ، یا هیچ کدام انجام هیچ حالت نیمه راه وجود ندارد.
به معامله ای مانند سوئیچ فکر کنید – یا به طور کامل تلنگر می زند یا اصلاً. این امر از فساد داده ها جلوگیری می کند ، به ویژه در سیستمهایی که چندین عملیات به شدت با هم همراه هستند.
اتمی در عمل: یک بستر دستور العمل مشترک
بیایید از داستان کلاسیک “انتقال بانکی” پرش کنیم. در اینجا یک سناریوی تازه در دنیای واقعی وجود دارد که نشان می دهد چرا اتمی بسیار مهم است:
سناریو: بستر ایجاد دستور العمل مشترک
بستری که کاربران می توانند به طور مشترک دستور العمل ها را ایجاد و ویرایش کنند.
مثال معامله اتمی:
وقتی کاربر ماده جدیدی را به دستور العمل اضافه می کند ، باید سه مورد اتفاق بیفتد:
-
این ماده به لیست مواد تشکیل دهنده دستور العمل اضافه می شود.
-
جدول زمانی “آخرین اصلاح شده” دستور العمل به روز می شود.
-
“شمارش مشارکت” مشارکت کننده افزایش یافته است.
مشکل بدون اتمی:
-
این ماده اضافه می شود ، اما دستور العمل دیگر وجود ندارد.
-
به روزرسانی تعداد مشارکت کننده ، اما این ماده هرگز ذخیره نمی شود.
-
یک قسمت موفق می شود در حالی که بخش های دیگر شکست می خورند ناسازگاری داده هابشر
همانطور که می بینید ، بدون اتمی ، خطر واقعی ناسازگاری داده ها وجود دارد – جایی که برخی از قسمت های معامله در حالی که برخی دیگر نیستند ذخیره می شوند. در یک برنامه دستور العمل ساده ، فقط ممکن است به معنای یک ماده مفقود شده یا تعداد مشارکت کننده نادرست باشد. اما در برنامه های تجاری مهم-مانند بانکداری ، تجارت الکترونیکی یا مراقبت های بهداشتی-حتی ناسازگاری های کوچک می تواند منجر به عواقب جدی شود. این می تواند به اعتماد کاربر آسیب برساند ، خطاهای سیستم را تحریک کرده و در نهایت باعث از بین رفتن مالی یا شهرت شود. به همین دلیل است که اتمی فقط یک چیز خوب نیست-ضروری است.
بنابراین ، چگونه پایگاه داده ها در واقع اتمی را در حین عملیات تضمین می کنند؟ بیایید ببینیم که چگونه می توانیم از اتمی با استفاده از معاملات SQL در یک سناریوی عملی اطمینان حاصل کنیم.
مثال SQL عملی
در اینجا چگونه می توانید این کار را در SQL انجام دهید اطمینان از اتمی:
BEGIN; -- Start the transaction
-- Step 1: Check if the recipe exists and lock it
SELECT recipe_id FROM recipes
WHERE recipe_id = 1
FOR UPDATE;
-- Step 2: Add a new ingredient
INSERT INTO ingredients (recipe_id, name, added_by)
VALUES (1, 'Garlic', 2);
-- Step 3: Update the recipe's timestamp
UPDATE recipes
SET last_modified = NOW()
WHERE recipe_id = 1;
-- Step 4: Increment user's contribution count
UPDATE users
SET contribution_count = contribution_count + 1
WHERE user_id = 2;
COMMIT; -- Commit only if all operations succeed
اگر هر قدم شکست می خورد، بانک اطلاعاتی قبلاً همه چیز را به حالت بازگرداند BEGIN
بشر
چگونه پایگاه داده ها اتمی را تضمین می کنند (زیر کاپوت)
حالا ممکن است تعجب کنید ، چگونه پایگاه داده اطمینان حاصل می کند که این رفتار همه یا هیچ چیز کار می کند، به خصوص اگر سیستم در بین خراب شود؟
جواب در چیزی به نام a نهفته است ورود به سیستم نوشتن (WAL)بشر
ورود به سیستم پیش توضیح توضیح داده شده
در postgresql ، ورود به سیستم نوشتن (WAL) تضمین می کند که هر معامله انجام می شود همه یا هیچ چیز– هسته اصلی اتمیبشر قبل از اینکه پایگاه داده هرگونه تغییر واقعی را ایجاد کند ، ابتدا آنها را به یک پرونده ورود به سیستم خاص می نویسد (وال). قبل از ارسال آن ، به آن فکر کنید مانند تهیه پیام در برنامه یادداشت های خود – اگر تلفن شما خراب است ، هنوز پیش نویس را دارید.
اگر سیستم در وسط معامله خراب شود ، PostgreSQL از آن ورود به سیستم استفاده می کند تا بفهمد چه چیزی با خیال راحت تمام شده است و چه چیزی نبود. من فقط تغییراتی را که به طور کامل انجام شده است اعمال می کند، و هر چیز دیگری را به عقب برگرداند. به این ترتیب ، پایگاه داده هرگز در حالت شکسته یا نیمه به روز به پایان نمی رسد.
وال همچنین لمس می کند دوام، زیرا حتی اگر برق از بین برود ، ورود به سیستم هنوز وجود دارد تا همه چیز را مانند گذشته برگرداند.
شبیه سازی وال در GO
package main
import (
"bufio"
"fmt"
"os"
)
type WriteAheadLog struct {
logFile string
}
func NewWriteAheadLog(filename string) *WriteAheadLog {
return &WriteAheadLog{logFile: filename}
}
func (wal *WriteAheadLog) LogWrite(transaction string) {
file, err := os.OpenFile(wal.logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("Error writing log:", err)
return
}
defer file.Close()
_, err = file.WriteString(transaction + "\n")
if err == nil {
fmt.Println("Logged:", transaction)
}
}
func (wal *WriteAheadLog) LogRecover() {
file, err := os.Open(wal.logFile)
if err != nil {
fmt.Println("Error reading log:", err)
return
}
defer file.Close()
fmt.Println("Recovering transactions...")
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println("Recovered:", scanner.Text())
}
}
func (wal *WriteAheadLog) Commit() {
err := os.WriteFile(wal.logFile, []byte{}, 0644)
if err != nil {
fmt.Println("Error committing log:", err)
} else {
fmt.Println("Committed transactions.")
}
}
func main() {
wal := NewWriteAheadLog("wal_log.txt")
wal.LogWrite("INSERT INTO users VALUES(1, 'Alice')")
wal.LogWrite("UPDATE users SET name="Bob" WHERE id = 1")
fmt.Println("\nSimulating system restart...\n")
wal.LogRecover()
wal.Commit()
}
پایان
اتمی تضمین می کند که عملیات داده شما پایگاه داده را در حالت شکسته یا متناقض قرار ندهد. این که آیا شما در حال ساختن یک برنامه اجتماعی ، یک بستر دستور العمل یا یک سیستم مالی – معاملات اتمی هستید اعتماد و یکپارچگی داده ها را حفظ کنیدبشر
پایگاه داده های مدرن ، به ویژه postgreSQL ، از مکانیسم هایی مانند استفاده کنید ولگرد برای تضمین اتمی حتی در مواجهه با تصادفات غیر منتظره. با درک این داخلی ها ، شما برای طراحی سیستم های قابل اعتماد و مقیاس پذیر مجهز می شوید.
در مقالات بعدی ، ما به ستون های باقیمانده اسید شیرجه می شویم –ثبات ، انزوا و دوام– هرچه به خودی خود بسیار مهم باشد.
قبل از پایان این پست ، می خواهم لحظه ای برای ابراز عشق عمیق و حمایت بی بدیل خود از برادران و خواهران مسلمان فلسطینی خود بگذارم. زندگی آنها ، مبارزات آنها و صدای آنها اهمیت دارد. در دنیایی که غالباً چشم کور می کند ، ما باید به صحبت کردن و ایستادن با مظلوم بپردازیم. ممکن است عدالت افزایش یابد ، ممکن است صلح پیروز شود ، و ممکن است مردم فلسطین با عزت ، آزادی و امید زندگی کنند. شما فراموش نمی شوید –زندگی شما مهم استافزایش اخیر فعالیت های تروریستی و اقدامات وحشیانه اسرائیل به طور واضح محکوم شده است.