Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
💎توضیح Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock 💎

خب بچه‌ها امروز می‌خوایم درباره چند تا مشکل رایج توی تراکنش‌های دیتابیس حرف بزنیم که ممکنه به دردتون بخوره. وقتی چند تا تراکنش به صورت همزمان توی دیتابیس کار می‌کنن، بعضی وقتا اتفاقای غیرمنتظره‌ای می‌افته که ممکنه به بی‌نظمی و باگ منجر بشه. این مشکلات شامل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock هستن. بیاید دونه دونه بررسیشون کنیم.

اول Dirty Read 💾

خب Dirty Read یعنی وقتی یه تراکنش داده‌هایی رو می‌خونه که هنوز توسط یه تراکنش دیگه نهایی (commit) نشده. این یعنی شما دارید چیزی رو می‌خونید که ممکنه عوض بشه یا حتی برگرده.

مثال: فرض کن یکی توی اپلیکیشن شما داره اطلاعات یه سفارش رو تغییر می‌ده ولی هنوز تغییرات رو ذخیره نکرده. حالا یه کاربر دیگه همون سفارش رو می‌بینه و تصمیم می‌گیره. اگر اون تغییرات نهایی نشن، اطلاعات اشتباهی به کاربر دوم رسیده.

دوم Non-Repeatable Read 🔄

خب Non-Repeatable Read وقتی پیش میاد که یه تراکنش، داده‌ای رو چند بار می‌خونه و دفعه‌های بعدی اون داده فرق می‌کنه، چون یه تراکنش دیگه اومده و اون داده رو وسط کار تغییر داده.

مثال: شما قیمت یه محصول رو برای یه مشتری نشون می‌دید. همزمان یه کاربر دیگه قیمت همون محصول رو تغییر می‌ده. وقتی مشتری دوباره صفحه رو رفرش کنه، قیمت متفاوتی می‌بینه.

سوم Phantom Read 👻

خب Phantom Read یعنی وقتی یه تراکنش یه مجموعه داده رو می‌خونه و در طول اجرای تراکنش، رکوردهای جدیدی به اون مجموعه اضافه یا حذف می‌شن. اینطوری وقتی دوباره همون پرس‌وجو رو انجام بدی، نتیجه متفاوتی می‌بینی.

مثال: فرض کن یه مدیر داره تعداد کارمندای یک بخش رو چک می‌کنه. در همون لحظه یکی دیگه یه کارمند جدید به همون بخش اضافه می‌کنه. حالا اگر مدیر دوباره تعداد کارمندها رو ببینه، یه کارمند جدید میاد توی لیست که دفعه قبل نبوده.

چهارم Deadlock 🔐

خب Deadlock وقتی اتفاق می‌افته که دو یا چند تراکنش همزمان منتظر همدیگه بمونن و نتونن کاری کنن. یعنی تراکنش‌ها همدیگه رو قفل می‌کنن و نمی‌تونن ادامه بدن.

مثال: فرض کن تراکنش A می‌خواد رکورد ۱ رو قفل کنه و منتظر رکورد ۲ هم هست. همزمان تراکنش B رکورد ۲ رو قفل کرده و منتظر رکورد ۱ هست. اینجا تراکنش‌ها همدیگه رو بلاک کردن و هیچ‌کدوم نمی‌تونن کاری بکنن.


جمع بندی 🎯

اینا مشکلات رایجی هستن که توی مدیریت تراکنش‌ها و همزمانی توی دیتابیس‌ها رخ می‌ده. با فهمیدن و شناسایی این مشکلات می‌تونید از بروز مشکلات جدی توی سیستم‌های دیتابیسی جلوگیری کنید و عملکرد بهتری داشته باشید.

امیدوارم مفید بوده باشه :)

#db #dead_lock #programing


@ninja_learn_ir
💎 چطوری مشکلات Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock رو هندل کنیم؟ 💎

توی پست قبلی درباره چند تا مشکل مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock حرف زدیم. امروز می‌خوایم ببینیم چطوری می‌تونیم اینا رو توی برنامه‌مون هندل کنیم. اینا مشکلاتیه که می‌تونن عملکرد دیتابیس و اپلیکیشن رو خراب کنن، ولی با استفاده از تکنیک‌های کنترل همزمانی و ایزولیشن می‌شه جلوی اینا رو گرفت.



1⃣ Dirty Read 💾

برای جلوگیری از Dirty Read، باید از سطح ایزولیشن مناسبی استفاده کنیم. یکی از بهترین سطوح ایزولیشن برای این کار Read Committed هست. این سطح تضمین می‌کنه که فقط داده‌های commit شده قابل خوندن هستن.

مثال:
فرض کن توی دیتابیستون از سطح ایزولیشن Read Committed استفاده می‌کنی. اگه تراکنش A داره داده‌هایی رو آپدیت می‌کنه، تراکنش B تا وقتی که A کارش تموم نشده و داده‌ها رو commit نکرده، نمی‌تونه اون داده‌ها رو ببینه. پس از Dirty Read جلوگیری می‌شه.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;



2⃣ Non-Repeatable Read 🔄

برای جلوگیری از Non-Repeatable Read، باید سطح ایزولیشن رو به Repeatable Read تغییر بدیم. این سطح ایزولیشن تضمین می‌کنه که اگر یک بار داده‌ای رو توی تراکنش خوندیم، تا پایان تراکنش دیگه تغییر نمی‌کنه.

مثال:
فرض کن توی یه فروشگاه آنلاین، وقتی یه کاربر قیمت یه محصول رو چک می‌کنه، باید مطمئن بشی که اون قیمت تا پایان تراکنش تغییر نمی‌کنه. با استفاده از Repeatable Read، هر چی کاربر دید، همون می‌مونه.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;




3⃣ Phantom Read 👻

برای حل مشکل Phantom Read باید از سطح ایزولیشن Serializable استفاده کنیم. این سطح از ایزولیشن باعث می‌شه که نه تنها داده‌های موجود، بلکه هر داده جدیدی هم تا پایان تراکنش دیده نشه.

مثال:
فرض کن یه مدیر داره گزارش تعداد کارمندای یه بخش رو چک می‌کنه. با سطح ایزولیشن Serializable، اگر کارمند جدیدی در طول تراکنش اضافه بشه، مدیر اون رو تا پایان تراکنش نمی‌بینه و از Phantom Read جلوگیری می‌شه.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;




4⃣ Deadlock 🔐

برای هندل کردن Deadlock، چند راه وجود داره:

1⃣ اجتناب از قفل‌های طولانی:
تراکنش‌ها رو سبک و سریع نگه دار تا قفل‌های طولانی ایجاد نشن.

2⃣ ترتیب دسترسی یکسان:
مطمئن شو که تراکنش‌ها به منابع به یه ترتیب دسترسی پیدا می‌کنن. یعنی اگر A و B هر دو به رکوردهای ۱ و ۲ نیاز دارن، هر دو اول رکورد ۱ رو قفل کنن و بعد برن سراغ رکورد ۲.

3⃣ زمان‌بندی دوباره تراکنش‌ها:
می‌تونی از دیتابیس بخوای که اگه Deadlock تشخیص داد، یکی از تراکنش‌ها رو ریست کنه و دوباره اجرا کنه.

مثال:
فرض کن توی اپلیکیشن مالی‌ات دو تراکنش همزمان دارن از منابع یکسان استفاده می‌کنن. یکی از راه‌های جلوگیری از Deadlock اینه که مطمئن بشی تراکنش‌ها به یه ترتیب مشخص به منابع دسترسی دارن، مثلاً اول رکورد ۱ رو قفل می‌گیرن و بعد رکورد ۲.

BEGIN TRANSACTION;
-- Lock resources in the same order



جمع‌بندی 🎯

با استفاده از سطوح ایزولیشن و یه سری تکنیک‌های مدیریت تراکنش، می‌تونیم مشکلاتی مثل Dirty Read، Non-Repeatable Read، Phantom Read و Deadlock رو توی دیتابیس‌هامون حل کنیم. اگر این نکات رو توی اپلیکیشن‌هاتون رعایت کنید، کارتون خیلی راحت‌تر و پایدارتر می‌شه.

امید وارم مفید بوده باشه :)

#sql #dead_lock #programing


@ninja_learn_ir
ـ Dependency Injection چیه؟ 🤔

امروز میخوایم بررسی کنیم Dependency Injection یا همون تزریق وابستگی چیه
خب Dependency injection یه مفهومی توی برنامه‌نویسی شی‌گراست که به ساده‌ترین شکل می‌شه گفت برای جداسازی وابستگی‌ها بین کلاس‌ها استفاده می‌شه. یعنی چی؟ یعنی به جای اینکه هر کلاس خودش مستقلاً وابستگی‌های مورد نیازش رو بسازه، این وابستگی‌ها از بیرون بهش تزریق می‌شه. این کار باعث می‌شه کد ما تمیزتر، انعطاف‌پذیرتر و قابل تست‌تر بشه.

چرا مهمه؟ 🤨

فرض کن یه کلاس داری که برای کارکردش نیاز به یه سری سرویس‌های دیگه داره. مثلاً کلاسی که مسئول لاگین کاربره، نیاز به سرویس دیتابیس داره. حالا اگه این سرویس رو خود کلاس بسازه، دیگه وابستگی محکمی بین این دو تا وجود داره. یعنی هر وقت بخوای دیتابیس رو عوض کنی، باید بری توی این کلاس دست ببری. اما اگه از Dependency Injection استفاده کنی، می‌تونی هر وقت خواستی به این کلاس هر دیتابیسی که دوست داری تزریق کنی، بدون اینکه نیاز باشه توی کدش تغییری بدی.

یه مثال ساده 🤓

فرض کن کلاس زیر رو داری که برای ارسال پیام نیاز به یه سرویس پیام‌رسان داره:

class NotificationService:
def __init__(self):
self.sender = EmailSender()

def send(self, message):
self.sender.send(message)


اینجا کلاس NotificationService مستقیم وابسته به EmailSender هست، یعنی اگه بعداً بخوای از یه روش دیگه برای ارسال پیام (مثلاً SMSSender) استفاده کنی، باید بری کد این کلاس رو تغییر بدی. این باعث می‌شه کدات به هم گره بخورن و انعطاف‌پذیری کم بشه.

حالا با استفاده از Dependency Injection اینجوری می‌نویسیمش:

class NotificationService:
def __init__(self, sender):
self.sender = sender

def send(self, message):
self.sender.send(message)


تو این حالت، sender (که می‌تونه EmailSender، SMSSender یا هر چیز دیگه‌ای باشه) از بیرون به NotificationService تزریق می‌شه. حالا اگه بخوای نوع ارسال پیام رو تغییر بدی، فقط کافیه یه شیء جدید بهش تزریق کنی:

email_sender = EmailSender()
sms_sender = SMSSender()

notification = NotificationService(email_sender) # استفاده از ایمیل
notification.send("Hello via Email!")

notification_sms = NotificationService(sms_sender) # استفاده از SMS
notification_sms.send("Hello via SMS!")



مزایای Dependency Injection 📈

1⃣ قابلیت تست بیشتر: چون وابستگی‌ها از بیرون تزریق می‌شن، می‌تونی راحت‌تر mock کنی و تست بنویسی.

2⃣ انعطاف‌پذیری بیشتر: راحت می‌تونی وابستگی‌های مختلف رو جایگزین کنی بدون اینکه توی کلاس تغییر بدی.

3⃣ کاهش coupling: وابستگی بین کلاس‌ها کمتر می‌شه و این باعث می‌شه کدات مستقل‌تر باشن.

جمع‌بندی 🎯

فهمیدیم که Dependency Injection بهت کمک می‌کنه که کدهای تمیزتری داشته باشی که راحت‌تر تست و اپدیت میشن. خیلی وقتا که بخوای یه اپلیکیشن بزرگ و مقیاس‌پذیر بنویسی، این الگو می‌تونه کارتو خیلی راحت‌تر کنه. پس دفعه بعد که داشتی کد می‌زدی و حس کردی یه کلاس داره زیادی به کلاس‌های دیگه وابسته می‌شه، به فکر استفاده از این روش باش 😉

ممنون میشم با ریکشن و شیر از ما حمایت کنید :) ❤️‍🔥

#programing #backend



@ninja_learn_ir
معرفی Pydantic 🧩

ـPydantic یه کتابخونه خفنه برای پایتون که بهت اجازه می‌ده راحت و دقیق داده‌هات رو اعتبارسنجی (validation) و تایپ کنی. اگه توی پروژه‌های بزرگ کار می‌کنی، Pydantic خیلی کمکت می‌کنه چون بهت کمک می‌کنه داده‌ها رو تمیز و بی‌نقص نگه داری.


چرا Pydantic؟ 🔍

فرض کن می‌خوای داده‌های کاربر رو توی یه اپلیکیشن بگیری، اما مطمئن نیستی که داده‌ها دقیقا همونی هستن که می‌خوای. ممکنه کاربر یه مقدار اشتباه وارد کنه، یه فیلد رو جا بندازه، یا نوع داده رو اشتباه بزنه. با Pydantic، می‌تونی مطمئن باشی که همه چیز درست وارد شده و اگه چیزی اشتباه بود، خیلی راحت یه ارور می‌گیری و جلوش رو می‌گیری.


چطور کار می‌کنه؟ 🔨

ـPydantic با استفاده از مدل‌ها کار می‌کنه. مدل‌ها همون کلاس‌های پایتون هستن که به کمکشون می‌تونی ساختار داده رو تعریف کنی. بیاید با یه مثال شروع کنیم:

from pydantic import BaseModel

class User(BaseModel):
id: int
name: str
email: str
age: int = 18 # مقدار پیش‌فرض

user_data = {
"id": 1,
"name": "Ali",
"email": "[email protected]"
}

user = User(**user_data)
print(user)

اینجا یه مدل به نام User تعریف کردیم که شامل id، name، email و age هست. اگه فیلدی رو اشتباه بدیم یا از نوعی غیر از نوع مشخص‌شده استفاده کنیم، Pydantic خطا می‌ده.


بررسی Validation در Pydantic 🛠️

ـPydantic بهت این امکان رو می‌ده که خیلی راحت داده‌ها رو اعتبارسنجی کنی. مثلا اگه بخوای مطمئن بشی که email به فرمت درستی وارد شده، Pydantic خودش اینو هندل می‌کنه و نیازی نیست دستی بررسی کنی. بیاین یه مثال دیگه رو ببینیم:

from pydantic import BaseModel, EmailStr, PositiveInt

class User(BaseModel):
id: PositiveInt
name: str
email: EmailStr
age: int = 18

try:
user = User(id=-1, name="Ali", email="ali@bad-email", age=22)
except ValueError as e:
print("خطا:", e)

اینجا PositiveInt و EmailStr رو استفاده کردیم که به طور خودکار id باید مثبت باشه و email هم باید فرمت درستی داشته باشه. این یعنی خیلی راحت می‌تونی داده‌ها رو کنترل کنی و از ورود داده‌های اشتباه جلوگیری کنی.

مدل‌های تو در تو (Nested Models) 🧬

اگه داده‌هات پیچیده‌ترن و شامل چند مدل می‌شن، می‌تونی مدل‌های تو در تو بسازی. مثلا:

from typing import List
from pydantic import BaseModel

class Address(BaseModel):
street: str
city: str

class User(BaseModel):
id: int
name: str
addresses: List[Address]

user_data = {
"id": 1,
"name": "Ali",
"addresses": [
{"street": "خیابون اول", "city": "تهران"},
{"street": "خیابون دوم", "city": "مشهد"}
]
}

user = User(**user_data)
print(user)

جمع‌بندی 🎯

فهمیدیم Pydantic یه ابزار قوی برای مدیریت و اعتبارسنجی داده‌هاست که به‌ویژه تو پروژه‌های بزرگ و APIها خیلی کمک می‌کنه. می‌تونی مدل‌های پیچیده بسازی، داده‌ها رو اعتبارسنجی کنی، و با استفاده از تایپ‌های قوی پایتون، کد تمیزتر و قابل خوانا تر بکنی.


امید وارم مفید بوده باشه :)

#python #pydantic #programing



@ninja_learn_ir
This media is not supported in your browser
VIEW IN TELEGRAM
#programing #algorithm


این ویدیو الگوریتم‌های مختلف Sorting رو به تصویر می‌کشه و نشون میده چطور هر کدوم عملیات مرتب‌سازی رو انجام میدن.
واقعا دیدنیه 🌚

🔆 CHANNEL | GROUP
💎 ـPartial Functions در پایتون 💎

تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومان‌ها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP می‌فرستی و همیشه متد رو روی POST می‌ذاری. به جای تکرار این مقدار ثابت، Partial Functions به کمکت میان و کدتو خیلی حرفه‌ای‌تر می‌کنن.


🔎 ـPartial Functions چی هست؟

خیلی ساده، Partial Function بهت اجازه می‌ده یه نسخه سفارشی‌شده از تابع اصلی بسازی که یه سری از آرگومان‌هاش از قبل مقداردهی شده. این کار با functools.partial انجام می‌شه.

🧠 چرا Partial Functions مفیدن؟

سادگی و تمیزی کد: به
جای تکرار، یه بار آرگومان ثابت رو تعریف می‌کنی.


کاهش خطا:
آرگومان‌های ثابت توی یه جای مشخص مقداردهی می‌شن.



ایجاد نسخه‌های شخصی‌سازی‌شده از توابع:
بدون نیاز به تعریف تابع جدید.



🛠️ چطور Partial Functions بسازیم؟
from functools import partial  

def multiply(x, y):
return x * y

double = partial(multiply, y=2)
print(double(5)) # خروجی: 10



اینجا double نسخه‌ای از multiply شده که مقدار y همیشه 2 هست. فقط لازمه x رو بهش بدی.

🚀 کاربردهای Partial Functions

1⃣ ساده‌سازی توابع با آرگومان‌های زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions می‌تونه کمکت کنه:

def send_request(method, url, headers, data):  
# ارسال درخواست
pass

post_request = partial(send_request, method='POST')
post_request(url='/api/data', headers={}, data={})

2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions می‌تونه با توابعی مثل map و filter خیلی خوب کار کنه:

from functools import partial  

def power(base, exponent):
return base ** exponent

square = partial(power, exponent=2)

numbers = [1, 2, 3, 4]
squared_numbers = list(map(square, numbers))
print(squared_numbers) # خروجی: [1, 4, 9, 16]

3⃣ بهبود خوانایی کد در سیستم‌های بزرگ

وقتی پروژه‌هات پیچیده می‌شن، Partial Functions بهت کمک می‌کنن توابعی بسازی که واضح‌ترن:
from functools import partial  

def logger(log_level, message):
print(f"[{log_level}] {message}")

info_logger = partial(logger, log_level='INFO')
info_logger("This is an info message") # خروجی: [INFO] This is an info message

⚖️ مقایسه با دیگر روش‌ها
ـPartial Functions یه جایگزین سبک‌تر برای تعریف کلاس‌های خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیده‌ای داری یا نیاز به شرط‌های مختلف هست، بهتره به جای Partial Functions از کلاس‌ها یا Wrapper Functions استفاده کنی.


✍️ جمع‌بندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که می‌تونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.

امید وارم مفید بوده باشه :)

#python #programing


🔆 CHANNEL | GROUP