PDA

View Full Version : برنامه نویسی شبکه و ویرایش همزمان



Mohammad S
جمعه 01 خرداد 1383, 19:21 عصر
با سلام خدمت دوستان عزیز
من در حال نوشتن برنامه ای برای کار به صورت شبکه ای هستم. از نظر تنظیمات و اتصال به سرور مشکلی ندارم تنها سوالم این است که اگر همزمان چند نفر با هم یک بانک را ویرایش کنند آیا اتفاق خاصی نخواهد افتاد یا مشکلی پیش نخواهد آمد؟ آیا کار اضافی لازم است انجام دهم؟ یا خود بانک اطلاعاتی (از SQL Server استفاده می کنم) خودش این کار را می کند؟ ضمنا در دلفی هم از dbExpress استفاده می کنم و از دستورات خود دلفی مثل Append, ClientDataset1,..... نه از دستورات SQL. برای ثبت تغییرات هم از دستور (ClientDataSet1.ApplyUpdates(0 استفاده می کنم که با این دستور هر تغییری که در بانک انجام شده و در حال حاضر در حافظه می باشد به دیسک منتقل می شود.
با تشکر

SReza1
شنبه 02 خرداد 1383, 18:23 عصر
خوب خیلی از کارا رو خود SQL server هندل میکنه. فقط موقعی مشکل پیش میآد که چند نفر میخوانئ همزمان یا رکورد را ویرایش کنند. در SQL server میشه فیلدی از نوع timestamp تعریف کرد که در این زمینه کمک خوبی میت.نه باشه.
در ضمن میتونی از روشهای فقل کردن رکورد استفاده کنی اینا کلیاتشه.

Mohammad S
یک شنبه 03 خرداد 1383, 00:25 صبح
با تشکر
احتمالا منظورتون از قفل کردن اینه که اگر یک نفر در حال ویرایش یک جدول بود، شخص دیگری نتواند آن را ویرایش کند. برای این تکنلیک، روشی که به ذهنم می رسد این است که یک جدول (چه موقت و چه دائم) بسازم که کاربری که در حال ویرایش یک رکورد است را در خود نگه دارد.
اما برای تکنیک اولی اگر ممکن است بیشتر توضیح دهید.
پیشاپیش ممنون از همکاریتان
:)

Delphi-Clinic
یک شنبه 03 خرداد 1383, 00:32 صبح
رکورد رو قفل نکن.

از شی session استفاده کن.

در ضمن سعی کن از خاصیت transaction شی database بخوبی استفاده کنی.

هیچوقت به امید ابزار نباش.

hr110
یک شنبه 03 خرداد 1383, 07:49 صبح
با سلام
شما وقتی یک رکورد را در حالت Edit قرار میدهید ، مثلاً با دستور ADOTABLE1.Edit; این رکورد برای شما قفل شده و کس دیگری نمیتواند در این تغییرات دهد و به قولی به حالت ReadOnly در خواهد آمد یعنی تنها شما میتوانید انرا تغییر دهید و دیگران تنها میتوانند انرا بخوانند. و بعد از اجرای دستور Post به حالت عادی برخواهد گشت.

Mohammad S
یک شنبه 03 خرداد 1383, 14:59 عصر
با تشکر از جواب شما دوستان عزیز
جناب آقای ربیعی یعنی به نظر شما لازم نیست من هیچ کار خاصی انجام دهم؟ و یک سوال دیگری اگر شخصی در حال Edit‌ یک رکورد باشد و شخص دیگری هم دستور Edit صادر کند آیا پیغام خطا خواهد داد یا اتفاق خاصی نخواهد افتاد یا صبر می کند تا نفر قبلی ویرایش خود را انجام دهد؟!


از شی session استفاده کن.

در ضمن سعی کن از خاصیت transaction شی database بخوبی استفاده کنی.

جناب Delphi-Clinic میشه این دو مورد را توضیح بیشتری بدهید؟

SReza1
یک شنبه 03 خرداد 1383, 22:57 عصر
با سلام
شما وقتی یک رکورد را در حالت Edit قرار میدهید ، مثلاً با دستور ADOTABLE1.Edit; این رکورد برای شما قفل شده و کس دیگری نمیتواند در این تغییرات دهد و به قولی به حالت ReadOnly در خواهد آمد یعنی تنها شما میتوانید انرا تغییر دهید و دیگران تنها میتوانند انرا بخوانند. و بعد از اجرای دستور Post به حالت عادی برخواهد گشت.
یه مشکل بعضی وقتها پیش میآد اینکه وقتی مثلا شما همزمان 10 رکورد رو خوندید و یکی از انها داره مبنویسه بعد از اینکه دستور ذخیره سازی صادر شد و طرف برنامه رو بست اطلاعات ذخیره میشه ولی نفر نفر بعد بدون اینکه ویرایشی انجام بده برنامه رو ببنده!! نتیجه اینه که اطلاعات نفر بعدی ذخیره میشه! و این اصلا خوب نیست!
در ضمن میشه از روشهای disconet record set استفاده کرد که عملا بدلیل disconnetc بودن اطلاعات ذخیره شده قفل نمیشه و سرعت پردازش هم بسیار بالا میره



احتمالا منظورتون از قفل کردن اینه که اگر یک نفر در حال ویرایش یک جدول بود، شخص دیگری نتواند آن را ویرایش کند. برای این تکنلیک، روشی که به ذهنم می رسد این است که یک جدول (چه موقت و چه دائم) بسازم که کاربری که در حال ویرایش یک رکورد است را در خود نگه دارد.
اما برای تکنیک اولی اگر ممکن است بیشتر توضیح دهید.
پیشاپیش ممنون از همکاریتان


در ado برای تنظیمات قفل property داره و میتونی از نوع خوشبینانه- بدبینانه و ... استفاده کنی

hr110
دوشنبه 04 خرداد 1383, 11:43 صبح
شما با استفاده از EDIT کردن و همان روشی که عرض شد میتوانید ورود اطلاعات خود را کنترل کنید، این مسئله را در یک پروژه عظیم اجرا کرده ام و از عملکرد ان مطمئن هستم(2 میلیون رکورد و 15 کاربر Online ).
در ضمن مطالعاتی نیز در مورد transactionها داشته باشید که امکانات خیلی خوبی به شما خواهد داد.

رهام
دوشنبه 04 خرداد 1383, 13:00 عصر
سلام
من برای این مشکل از یک tabelدر sql استفاده می کنم.
انجوری که:
1-کاربرانی که درخواست editهمزمان یک رکورد را می کنند اسامی آنها در این tableذخیره می شود.
2-برحسب این که کی زودتر اسمش برای ویرایش رکورد آمده اجازه پیدا میکنه که رکورد را ویرایش کنه.
3-حالا ویرایش تمام شد کاربر اسمش را از تو لیست برمی داره و نوبت به کاربری بعدی که می خواهد همان رکورد را ویرایش کند می رسه.
وسلام
البته توی table که گفتم باید مشخصات رکورد که می خواهد ویرایش بشه وارد کنید. :)

SReza1
دوشنبه 04 خرداد 1383, 21:45 عصر
سلام
من برای این مشکل از یک tabelدر sql استفاده می کنم.
انجوری که:
1-کاربرانی که درخواست editهمزمان یک رکورد را می کنند اسامی آنها در این tableذخیره می شود.
2-برحسب این که کی زودتر اسمش برای ویرایش رکورد آمده اجازه پیدا میکنه که رکورد را ویرایش کنه.
3-حالا ویرایش تمام شد کاربر اسمش را از تو لیست برمی داره و نوبت به کاربری بعدی که می خواهد همان رکورد را ویرایش کند می رسه.
وسلام
البته توی table که گفتم باید مشخصات رکورد که می خواهد ویرایش بشه وارد کنید. :)


خوب اگها به دلایلی وسط کار سیستم hang کنه که دیگه نمیشه اون رکورد رو ویرایش کرد!