Python Coding Academy
🐍 آموزش جامع Python — پست ۲۲۴
مدیریت همزمانی در SQLite با حالت WAL
وقتی چند بخش از برنامه بهطور همزمان از یک Database استفاده میکنند، مدیریت خواندن و نوشتن اهمیت زیادی پیدا میکند.
SQLite برای این موضوع حالتی به نام WAL (Write-Ahead Logging) دارد.
در این حالت، تغییرات ابتدا در فایل لاگ ثبت میشوند و بعداً میتوانند به فایل اصلی Database منتقل شوند.
🔹 فعالکردن WAL
import sqlite3
connection = sqlite3.connect("shop.db")
mode = connection.execute(
"PRAGMA journal_mode = WAL"
).fetchone()[0]
print(mode)
connection.close()
خروجی معمولاً:
wal
SQLite حالت Journal را به WAL تغییر میدهد و نام حالت فعال را برمیگرداند.
🔹 WAL چه مزیتی دارد؟
در حالت معمول، خواندن و نوشتن ممکن است بیشتر یکدیگر را مسدود کنند.
WAL معمولاً اجازه میدهد:
خوانندهها همزمان با یک نویسنده فعال باشند.
خواندن و نوشتن در بسیاری از شرایط روانتر انجام شود.
تغییرات ابتدا در فایل -wal ثبت شوند.
اما نکته مهم این است که WAL چند نویسنده همزمان را ممکن نمیکند؛ SQLite همچنان در هر لحظه فقط یک نویسنده فعال دارد.
🔹 مشاهده فایلهای Database
وقتی WAL فعال باشد، ممکن است کنار فایل اصلی این فایلها را ببینی:
shop.db
shop.db-wal
shop.db-shm
shop.db فایل اصلی Database است.
shop.db-wal تغییرات ثبتشده در WAL را نگه میدارد.
shop.db-shm برای هماهنگی دسترسیها استفاده میشود.
وجود این فایلها در زمان فعال بودن WAL طبیعی است.
🔹 Checkpoint چیست؟
Checkpoint فرایندی است که تغییرات موجود در WAL را به فایل اصلی Database منتقل میکند.
برای اجرای Checkpoint میتوانیم از دستور زیر استفاده کنیم:
import sqlite3
with sqlite3.connect("shop.db") as connection:
result = connection.execute(
"PRAGMA wal_checkpoint(PASSIVE)"
).fetchone()
print(result)
حالت PASSIVE تلاش میکند بدون منتظر ماندن برای خوانندههای مزاحم، تا حد ممکن Checkpoint انجام دهد.
معمولاً لازم نیست در هر عملیات این دستور را دستی اجرا کنیم؛ SQLite میتواند Checkpoint را خودکار مدیریت کند.
⚠️ نکات مهم
WAL برای بسیاری از برنامههای محلی و چندخوانندهای مفید است.
WAL برای دسترسی مستقیم چند رایانه از طریق فایلسیستم شبکهای مناسب نیست.
هنگام پشتیبانگیری، فایل اصلی را بهتنهایی و بدون درنظرگرفتن وضعیت WAL کپی نکن؛ برای Backup مطمئن میتوانی از Connection.backup() استفاده کنی.
فعالکردن WAL به معنی حذف محدودیت یک نویسنده همزمان نیست.
🧠 خلاصه
WAL
↓
ثبت تغییرات در فایل لاگ
↓
امکان خواندن همزمان با نوشتن
↓
Checkpoint
↓
انتقال تغییرات به Database اصلی
🎯 تمرین
برنامهای بنویس که:
به shop.db متصل شود.
حالت WAL را فعال کند.
حالت فعال را چاپ کند.
یک رکورد درج کند.
اتصال را بهدرستی مدیریت کند.
پست ۲۲۴ از دوره جامع Python 🐍
3 ·