Transcript طرح S 2

Slide 1

‫مدل های اجرای سريال و‬
‫همروند تراکنش ها‬
Dr. Fatemeh Ahmadi-Abkenari
February 2013
Advanced Database


Slide 2

‫اجرای سريال و همروند تراکنش ها‬
‫‪2‬‬

‫تعاريف‬
‫برای اجرای چند تراکنش‪ ،‬ساده ترين راهکار اجرای متوالی و سريال تراکنش ها به صورت پشت سرهم است‪ .‬اين‬
‫مدل از اجرا هرگز پايگاه داده را در وضعيت ناسازگار قرار نمی دهد و نتيجه ی اجرای يک طرح که از اجرای متوالی دو‬
‫يا چند تراکنش بدست آمده است هميشه درست است‪.‬‬
‫اجرای سريال (متوالی) تراکنش ها علی رغم مزيت سادگی‪ ،‬زمان بر و فاقد کارايی است‪ .‬البته در موارد چندی‪ ،‬اجرای‬
‫سريال تراکنش ها بهترين گزينه است مانند شرايطی که در آن تراکنش ها کوتاه باشند‪ ،‬پايگاه به تمامی مقيم‬
‫حافظه اصلی باشد‪ ،‬ماهيت کاربرد مانع از اجرای همروند تراکنش ها شود‪... ،‬‬
‫همروندی (‪ )Concurrency‬اجرای تراکنش ها‪ ،‬به معنی اجرای نامتوالی و تودرتوی تراکنش های مزبور است‪.‬‬
‫بديهی است زمانی که چند تراکنش به داده های يکسانی دسترس ی دارند اجرای همروند آنها بايد کنترل شود چراکه‬
‫در غير اين صورت تداخل (‪ )Interference‬عمل ها موجب عملکرد ناصحيح و افت کارايی برنامه کاربردی می‬
‫گردد‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 3

‫مثال‬
‫‪3‬‬

‫دو تراکنش ‪ T1‬و ‪ T2‬برروی دو فقره داده ی ‪ D‬و ‪ F‬عملياتی به صورت طرح های زير انجام می دهند‪:‬‬
‫‪T2‬‬
‫‪T1‬‬

‫‪T2‬‬

‫)‪R(D‬‬
‫‪D:=D-N‬‬
‫)‪W(D‬‬
‫)‪R(D‬‬
‫‪D:=D+M‬‬
‫)‪W(D‬‬

‫‪T1‬‬

‫)‪R(D‬‬
‫‪D:=D-N‬‬
‫)‪R(D‬‬
‫‪D:=D+M‬‬
‫)‪W(D‬‬
‫)‪R(F‬‬
‫)‪W(D‬‬
‫‪F:= F+N‬‬
‫)‪W(F‬‬

‫)‪R(F‬‬
‫‪F:= F+N‬‬
‫)‪W(F‬‬

‫طرح ‪S4‬‬

‫پايگاه داده پيشرفته‬

‫طرح ‪S3‬‬

‫‪T2‬‬

‫‪T1‬‬

‫‪T2‬‬

‫)‪R(D‬‬
‫‪D:=D-N‬‬
‫)‪W(D‬‬
‫)‪R(F‬‬
‫‪F:= F+N‬‬
‫)‪W(F‬‬

‫)‪R(D‬‬
‫‪D:=D+M‬‬
‫)‪W(D‬‬
‫)‪R(D‬‬
‫‪D:=D-N‬‬
‫)‪W(D‬‬
‫)‪R(F‬‬
‫‪F:= F+N‬‬
‫)‪W(F‬‬

‫‪T1‬‬

‫)‪R(D‬‬
‫‪D:=D+M‬‬
‫)‪W(D‬‬

‫طرح ‪S1‬‬

‫طرح ‪S2‬‬
‫در اين مثال طرح های ‪ S1‬و ‪ S2‬سريال و‬
‫طرح های ‪ S3‬و ‪ S4‬همروند هستند‪.‬‬


Slide 4

‫مشکالت ناش ی از عدم کنترل تراکنش های همروند‬

‫‪1- Lost Update‬‬
‫(بهنگام شدن از دست رفته)‬
‫‪2- Dirty Data Read‬‬
‫(خواندن داده ی ناجور)‬
‫‪3- Inconsistent Analysis‬‬
‫(تحليل ناسازگار)‬
‫)‪4- Unrepeatable Read (Fuzzy Read‬‬
‫(خواندن تکرار نشدنی (خواندن فازی))‬
‫پايگاه داده پيشرفته‬


Slide 5

‫بهنگام شدن از دست رفته‬
‫)‪(Lost Update‬‬

‫‪5‬‬

‫زمانی که تراکنش ی درست پس از يک تراکنش ديگر اقدام به نوشتن داده ای کند که تراکنش قبل نيز آن را نوشته‬
‫بود اين مشکل بروز می کند که منجر به از دست رفتن مقدار نوشته شده و بهنگام شده توسط تراکنش نخست می‬
‫شود‪.‬‬
‫طرح ‪S‬‬
‫‪T2‬‬

‫در طرح ‪ ،S‬مقدار نوشته شده‬
‫توسط تراکنش ‪ T1‬در لحظه ‪ t3‬از‬
‫دست می رود‪.‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1-N‬‬

‫)‪R(D1‬‬
‫)‪W(D1‬‬
‫‪D1:=D1+N‬‬
‫)‪W(D1‬‬
‫)‪R(D2‬‬
‫‪D2:=D2+M‬‬
‫)‪W(D2‬‬

‫پايگاه داده پيشرفته‬

‫‪t1‬‬

‫‪t2‬‬
‫‪t3‬‬
‫‪t4‬‬
‫‪t5‬‬


Slide 6

‫خواندن داده ی ناجور‬
‫)‪(Dirty Data Read‬‬

‫‪6‬‬

‫اين مشکل زمانی بروز می کند که تراکنش دومی داده ی نوشته شده و تغيير يافته توسط تراکنش ی را که هنوز‬
‫تثبيت نشده‪ ،‬بخواند‪ .‬چرا که در صورت ناکامل تمام شدن تراکنش اول و واگرد آن‪ ،‬تراکنش دوم از نتايج ميانی آن‬
‫استفاده کرده است‪.‬‬
‫طرح ‪S‬‬

‫در طرح ‪ ،S‬مقدار نوشته شده توسط‬
‫تراکنش ‪ T1‬بر روی داده ی ‪ D1‬در‬
‫لحظه ‪ t2‬توسط تراکنش ‪ T2‬خوانده‬
‫می شود‪.‬‬

‫‪T2‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1+N‬‬
‫)‪W(D1‬‬

‫)‪R(D1‬‬
‫‪D1:=D1+M‬‬
‫)‪W(D1‬‬

‫‪t2‬‬

‫)‪R(D3‬‬

‫پايگاه داده پيشرفته‬

‫‪t1‬‬

‫‪t3‬‬


Slide 7

‫خواندن تکرار نشدنی (فازی)‬
‫))‪(Unrepeatable Read (Fuzzy Read‬‬
‫‪7‬‬

‫اين مشکل زمانی بروز می کند که تراکنش اول‪ ،‬دو بار داده ای را می خواند اما مابين اين دوبار خواندن‪ ،‬تراکنش‬
‫دوم داده مزبور را بهنگام نموده و تثبيت نيز شده است‪ .‬بنابراين مقدار اوليه داده مزبور‪ ،‬ديگر قابل دسترس ی‬
‫نخواهد بود‪.‬‬
‫طرح ‪S‬‬
‫‪T2‬‬

‫در طرح ‪ ،S‬تراکنش ‪ T1‬دو بار داده ی ‪ D1‬را در‬
‫لحظات ‪ t1‬و ‪ t3‬می خواند داده ی ‪ D1‬مابين دو بار‬
‫خوانده شدن‪ ،‬توسط تراکنش ‪ T2‬تغيير يافته و‬
‫تراکنش ‪ T2‬تثبيت نيز شده است‪.‬‬

‫پايگاه داده پيشرفته‬

‫‪D1:= D1 – X‬‬
‫)‪W(D1‬‬
‫‪COMMIT‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1+X‬‬
‫)‪W(D1‬‬

‫‪t1‬‬

‫‪t2‬‬

‫)‪R(D1‬‬
‫‪Y:=Y – D1‬‬
‫)‪W(Y‬‬
‫‪COMMIT‬‬

‫‪t3‬‬


Slide 8

‫تحليل ناسازگار‬
‫)‪(Inconsistent Analysis‬‬

‫‪8‬‬

‫اين مشکل زمانی بروز می کند که تراکنش اول‪ ،‬دو داده ی متفاوت را بهنگام می کند و تراکنش دوم اقدام به‬
‫خواندن يکی از دو داده قبل از بهنگام شدن و خواندن ديگری پس از بهنگام شدن می نمايد‪ .‬در نتيجه‪ ،‬حاصل‬
‫محاسبه ای که در آن دو داده ی ذکر شده در تراکنش دوم حضور داشته باشند ناصحيح خواهد شد‪.‬‬
‫طرح ‪S‬‬

‫‪T2‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1-N‬‬
‫)‪W(D1‬‬

‫در طرح ‪ ،S‬مقدار نوشته شده‬
‫توسط تراکنش ‪ T1‬بر روی داده ی‬
‫‪ D1‬در لحظه ‪ t2‬توسط تراکنش‬
‫‪ T2‬خوانده می شود‪.‬‬

‫پايگاه داده پيشرفته‬

‫)‪R(D1‬‬
‫‪SUM:=SUM + D1‬‬
‫)‪R(D2‬‬
‫‪SUM:=SUM + D2‬‬

‫‪t1‬‬

‫‪t2‬‬

‫)‪R(D2‬‬
‫‪D2:=D2 + N‬‬
‫)‪W(D2‬‬

‫‪t3‬‬


Slide 9

‫طرح های با قابليت اجرای سريال‬
‫‪9‬‬

‫با توجه به مشکالت مطرح شده در اساليدهای قبل‪ ،‬مالحظه می شود که اجرای همروند تراکنش ها در صورت‬
‫کنترل نشدن منجر به نتايج نادرست می گردد‪.‬‬
‫آنچه که بر صحت و درستی نتايج حاصل از اجرای همروند تراکنش ها صحه می گذارد يکی بودن نتايج حاصل از‬
‫اجرای همروند تراکنش ها با نتيجه حاصل از اجرای متوالی و سريال آنهاست‪ .‬بنابراين برای ‪ n‬تراکنش مفروض‪،‬‬
‫طرح ‪ )S Schedule( S‬که به صورت همروند اجرا می شود قابليت سريال شدن (‪ )Serializable‬دارد اگر‬
‫همان نتيجه توليد شود و تاثير آن بر روی پايگاه همان باشد که طرح حاصل از اجرای متوالی و سريال اين ‪n‬‬
‫تراکنش‪.‬‬
‫بنابراين اجرای همروند مجموعه ای از تراکنش ها در صورتی درست است که طرح اجرا‪ ،‬قابليت سريال شدن‬
‫داشته باشد‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 10

‫طرح های با قابليت اجرای سريال‬
‫‪10‬‬

‫مثال‬

‫تراکنش های ‪ T1‬و ‪ T2‬به صورت روبرو مفروضند‪:‬‬
‫اگر تراکنش های ‪ T1‬و ‪ T2‬را همروند و به صورت‬
‫طرح ‪ S3‬اجرا کنيم بررس ی می کنيم که آيا اين طرح‬
‫همروند‪ ،‬قابليت سريال شدن دارد يا خير؟‬
‫حل‪ :‬دو طرح متوالی برای تراکنش های ‪ T1‬و ‪ T2‬به صورت زير است‪:‬‬
‫)‪ S1: (T1, T2‬و )‪S2: (T2, T1‬‬
‫با شروع تست با مقادير اوليه ‪ D1= 100‬و ‪ D2=200‬خواهيم داشت‪:‬‬
‫پس از اجرای همروند تراکنش ها در قالب طرح ‪ S3‬مقدار داده ی ‪ D1= 45‬و‬
‫داده ی ‪ D2=255‬خواهد بود که اين مقادير برابر با نتيجه ی حاصل از اجرای‬
‫متوالی دو تراکنش در قالب طرح ‪ S1‬هستند‪ .‬از اين رو‪ ،‬طرح ‪ S3‬را‬
‫‪ Serializable‬يا يک طرح همروند با قابليت سريال شدن می دانيم که اين‬
‫امر‪ ،‬بر صحت مدل همروندی مطرح شده در طرح ‪ S3‬صحه می گذارد‪.‬‬

‫‪T1‬‬

‫‪T2‬‬
‫)‪R(D1‬‬
‫‪TEMP:=D1* 0.1‬‬
‫‪D1:=D1-TEMP‬‬
‫)‪W(D1‬‬
‫)‪R(D2‬‬
‫‪D2:= D2+TEMP‬‬
‫)‪W(D2‬‬
‫‪T2‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1-50‬‬
‫)‪W(D1‬‬

‫)‪R(D1‬‬
‫‪TEMP:=D1* 0.1‬‬
‫‪D1:=D1 - TEMP‬‬
‫)‪W(D1‬‬

‫‪t1‬‬

‫‪t2‬‬

‫)‪R(D2‬‬
‫‪D2:=D2 + 50‬‬
‫)‪W(D2‬‬
‫)‪R(D2‬‬
‫‪D2:=D2 + TEMP‬‬
‫)‪W(D2‬‬

‫پايگاه داده پيشرفته‬

‫)‪R(D1‬‬
‫‪D1:=D1 - 50‬‬
‫)‪W(D1‬‬
‫)‪R(D2‬‬
‫‪D2:= D2+50‬‬
‫)‪W(D2‬‬

‫‪t3‬‬

‫‪t4‬‬


Slide 11

‫طرح های معادل‬
‫(‪)Equivalent Schedules‬‬

‫‪11‬‬

‫دو طرح مختلف حاصل از اجرای دو تراکنش (به صورت همروند و يا سريال) معادل نتيجه ای ( ‪Result‬‬
‫‪ )Equivalent‬هستند اگر نتيجه ی حاصل از اجرای آن دو يکسان باشد‪ .‬اين يکسان بودن نتايج بايد به ازای‬
‫همه ی حاالت و مقادير اوليه باشد و اگر فقط به ازای بعض ی از مقادير اوليه و يا به صورت اتفاقی صورت گيرد دو‬
‫طرح (‪ )Schedule‬معادل نتيجه ای نيستند‪ .‬در مثال مطرح شده در اساليد قبل‪ ،‬طرح های ‪ S1‬و ‪ S3‬معادل‬
‫نتيجه ای هستند‪.‬‬
‫`‪S‬‬
‫)‪R(D‬‬
‫‪D:=D* 1.1‬‬
‫)‪W(D‬‬

‫‪S‬‬
‫)‪R(D‬‬
‫‪D:=D + 10‬‬
‫)‪W(D‬‬

‫در مثال باال دو طرح ‪ S‬و `‪ S‬که تنها شامل يک تراکنش هستند معادل نتيجه ای نمی باشند‪ .‬چراکه به ازای تمامی‬
‫مقادير ‪ D‬نتيجه ی يکسان بدست نمی آيد‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 12

‫طرح های معادل‬
‫(‪)Equivalent Schedules‬‬

‫‪12‬‬

‫دو طرح مختلف حاصل از اجرای دو تراکنش (به صورت همروند و يا سريال) معادل تعارض ی ( ‪Conflict‬‬
‫‪ )Equivalent‬هستند اگر نتيجه ی حاصل از اجرای آن دو يکسان باشد و ترتيب اجرای هر دو دستور متعارض‬
‫در آن دو طرح نيز يکسان باشد‪.‬‬
‫دو دستور متعارض (‪ )Conflicting Operations‬دستوراتی هستند که بر روی يک فقره داده ای عمل کرده و‬
‫الاقل يکی ازآن دو‪ ،‬دستور نوشتن باشد‪ .‬در غير اين صورت‪ ،‬دو دستور نامتعارض (‪)Commute Operations‬‬
‫هستند‪.‬‬
‫)‪(4‬‬

‫)‪(3‬‬

‫)‪(2‬‬

‫)‪(1‬‬

‫)‪W(D‬‬
‫)‪W(D‬‬

‫)‪W(D‬‬
‫)‪R(D‬‬

‫)‪R(D‬‬
‫)‪W(D‬‬

‫)‪R(D‬‬
‫)‪R(D‬‬

‫در حاالت (‪ )3( ،)2‬و (‪ )4‬دو دستور متعارضند و در حالت (‪ )1‬دو دستور نامتعارضند‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 13

‫طرح های معادل‬
‫(‪)Equivalent Schedules‬‬

‫‪13‬‬

‫مثال‬
‫طرح ‪ S2‬با طرح سريال )‪ S1: (T1, T2‬معادل نتيجه ای است‬
‫حال آنکه دو دستور )‪ W(D2‬از تراکنش ‪ T2‬و )‪ R(D2‬از‬
‫تراکنش ‪ T1‬متعارضند و ترتيب اجرای آنها در طرح های ‪ S1‬و ‪S2‬‬
‫مانند هم نيست‪ .‬بنابراين‪ ،‬اين دو طرح معادل تعارض ی نيستند‪.‬‬
‫معادل نتيجه ای بودن طرح سريال )‪ S1: (T1, T2‬و طرح ‪ S2‬با‬
‫تست مقادير داده ای ‪ D1‬و ‪ D2‬پس از اجرای کامل ‪ S1‬و ‪ S2‬و با‬
‫تست چند مقدار اوليه برای اين دو فقره ی داده ای قابل‬
‫دستيابی است‪.‬‬

‫پايگاه داده پيشرفته‬

‫‪T2‬‬

‫‪T1‬‬
‫)‪R(D1‬‬
‫‪D1:=D1- 50‬‬
‫)‪W(D1‬‬

‫)‪R(D2‬‬
‫‪D2:=D2- 10‬‬
‫)‪W(D2‬‬
‫)‪R(D2‬‬
‫‪D2:=D2+50‬‬
‫)‪W(D2‬‬
‫)‪R(D1‬‬
‫‪D1:=D1+10‬‬
‫)‪W(D1‬‬


Slide 14

‫گراف تعارض‬
‫(‪)Conflicting Graph‬‬

‫‪14‬‬

‫گراف تعارض به گراف پيشايندی (‪ )Precedence Graph‬و يا گراف سريال شدن ( ‪Serialization‬‬
‫‪ )Graph‬نيز معروف است‪ .‬از اين گراف‪ ،‬برای آزمون قابليت سريال شدن يک طرح استفاده می شود‪ .‬بر مبنای‬
‫اين گراف‪ ،‬يک طرح همروند که گراف بر اساس آن رسم می شود در صورتی قابليت اجرا به صورت سريال را دارد‬
‫و يا درست است و معادل تعارض ی طرح سريال خود می شود که در گراف دور به وجود نيايد‪.‬‬
‫در رسم اين گراف‪ ،‬به ازای هر تراکنش ‪ Ti‬در طرح ‪ ،S‬يک گره (‪ )Node‬در نظر گرفته می شود‪ .‬در صورتی از گره‬
‫‪ Ti‬به گره ‪ Tj‬يک مسير وجود دارد که‬
‫‪ -1‬عمل )‪ R(D‬در تراکنش ‪ Tj‬پس از عمل )‪ W(D‬از تراکنش ‪ Ti‬صورت گيرد‪.‬‬
‫‪ -2‬عمل )‪ W(D‬در تراکنش ‪ Tj‬پس از عمل )‪ R(D‬از تراکنش ‪ Ti‬صورت گيرد‪.‬‬
‫‪ -3‬عمل )‪ W(D‬در تراکنش ‪ Tj‬پس از عمل )‪ W(D‬از تراکنش ‪ Ti‬صورت گيرد‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 15

‫گراف تعارض‬
‫(‪)Conflicting Graph‬‬

‫مثال ‪1‬‬

‫‪15‬‬

‫طرح ‪S1‬‬

‫‪Y‬‬
‫‪T3‬‬

‫‪T1‬‬

‫‪T2‬‬

‫)‪R(Z‬‬
‫)‪R(Y‬‬
‫)‪W(Y‬‬

‫‪X‬‬
‫‪Y‬‬

‫‪Z,‬‬
‫‪Y‬‬

‫‪T2‬‬

‫‪T1‬‬

‫)‪R(Y‬‬
‫)‪R(Z‬‬
‫)‪R(X‬‬
‫)‪W(X‬‬

‫‪T3‬‬

‫)‪W(Y‬‬
‫)‪W(Z‬‬
‫)‪R(X‬‬

‫گراف بدست آمده از طرح ‪ S1‬به علت وجود دور در گراف قابليت سريال‬
‫شدن ندارد بنابراين طرح ‪ S1‬طرح سريال معادل ندارد‪.‬‬

‫پايگاه داده پيشرفته‬

‫)‪R(Y‬‬
‫)‪W(Y‬‬
‫)‪W(X‬‬


Slide 16

‫گراف تعارض‬
‫(‪)Conflicting Graph‬‬

‫مثال ‪2‬‬

‫‪16‬‬

‫طرح ‪S2‬‬

‫‪X, Y‬‬
‫‪T3‬‬

‫‪T2‬‬

‫‪T1‬‬

‫‪Z,‬‬
‫‪Y‬‬

‫‪Y‬‬

‫‪T2‬‬

‫‪T1‬‬

‫)‪R(Y‬‬
‫)‪R(Z‬‬

‫)‪R(X‬‬
‫)‪W(X‬‬
‫)‪W(Y‬‬
‫)‪W(Z‬‬
‫)‪R(Z‬‬

‫‪T3‬‬
‫گراف بدست آمده از طرح ‪ S2‬قابليت سريال شدن دارد بنابراين طرح ‪S2‬‬
‫طرح سريال معادل دارد که به صورت ‪ T3  T1  T2‬است ‪.‬‬

‫پايگاه داده پيشرفته‬

‫)‪R(Y‬‬
‫)‪W(Y‬‬
‫)‪R(Y‬‬
‫)‪W(Y‬‬
‫)‪R(X‬‬
‫)‪W(X‬‬


Slide 17

‫مفهوم قابليت سريال شدن‬
‫(‪)Serializability‬‬

‫‪17‬‬

‫مفهوم قابليت سريال شدن يک طرح همروند به معنای تبديل آن به يک طرح سريال نيست چراکه طرح های‬
‫سريال و متوالی عموما ناکارامد هستند‪.‬‬
‫مفهوم قابليت سريال شدن يک طرح همروند که با رسم گراف تعارض می توان به آن رسيد اين است که آيا اين‬
‫طرح همروند دارای يک طرح معادل سريال از نوع تعارض ی هست و يا خير‪.‬‬
‫مفهوم قابليت سريال شدن يک طرح همروند که با رسم گراف تعارض می توان به آن رسيد اين است که آيا اجرای‬
‫اين طرح به صورت همروند صحت اجرا را تضمين می نمايد و يا خير‪.‬‬
‫به علت دشوار بودن آزمون قابليت سريال شدن در عمل‪ ،‬واحد مديريت تراکنش ها به مديريت امکان اجرای‬
‫همروند تراکنش ها می پردازد و برای اين منظور از پروتکل های همروندی به منظور کنترل اجرای همروند تراکنش‬
‫ها استفاده می کند که اين پروتکل ها در درس آينده مورد بررس ی قرار خواهند گرفت‪.‬‬

‫پايگاه داده پيشرفته‬


Slide 18

‫‪18‬‬

‫برای مطالعه بيشتر‬

‫‪1- Database Systems An Application Oriented Approach‬‬
‫‪Chapter 20, Implementing Isolation.‬‬
‫‪Michael Kifer, Arthur Bernstein, Philip M. Lewis‬‬
‫‪Pearson Addison Wesley Publication, 2006.‬‬

‫‪ -2‬سيستم مديريت پايگاه داده ها (مفاهيم و تکنيک ها)‪.‬‬
‫فصل دوم‪ ،‬مفاهيمی از تئوری توالی پذيری‪.‬‬
‫تاليف‪ :‬سيد محمد تقی روحانی رانکوهی‪.‬‬
‫انتشارات جلوه‪ ،‬مجموعه دانش و فن کامپيوتر ‪.1386 ،13‬‬

‫پايگاه داده پيشرفته‬