ورود

View Full Version : کنترل رکورد ها



محسن بابائی
شنبه 28 مرداد 1385, 05:52 صبح
چطوری توی برنامه های تحت شبکه کنترل کنیم که کاربر ها در رکوردهایی که همزمان استفاده می کنند اختلال ایجاد نشود. مثلا کاربری که یک رکورد را دارد ویرایش می کند کاربر دیگر نتواند آنرا حذف کند.

حمیدرضاصادقیان
شنبه 28 مرداد 1385, 09:57 صبح
دوست عزیز میتونی هم از رکوردهای Recordset ها استفاده کنی هم میتونی یک فیلد بیت در جدول اضافه کنی و هر وقت که مقدارش یک بود اجازه کاری به کس دیگه ایی روی اون رکورد ندی.

محسن بابائی
شنبه 28 مرداد 1385, 10:08 صبح
م میتونی یک فیلد بیت در جدول اضافه کنی و هر وقت که مقدارش یک بود اجازه کاری به کس دیگه ایی روی اون رکورد ندی.

این روش که مطمئن نیست و کلا روش خوبی نیست. چون اگر در حین کار کامپیوتر رسیت شود و یا برق برود وضعیت آشفته می شود.
در مورد recordset توضصیح بدین.
با تشکر

h_baqery
شنبه 28 مرداد 1385, 11:50 صبح
تا حالا یه همچین مشکلی رو ندیدم ،‌فکر می کنم خود SQLSERVER مدیریت می کنه که یه همچین مشکلی پیش نیاد.
تو تاپیکهای قبلی هم جستجو کنید مطالبی در این باره هست.

حمیدرضاصادقیان
شنبه 28 مرداد 1385, 15:04 عصر
درباره رکورد ست هم ببینید اگه شما با دلفی کار میکنید مثلا کامپوننت adoquery این امکان رو به شما میده که بتونی رکورد جاری رو قفل کنی ولی مشکلش اینه که سرعت رو کند میکنه و مشکلات جانبی خودشو داره.یا از طریق خود sql که اونهم باز اگه تعداد قفلها زیاد باشه یا یک قفل زمان زیادی نگه داری بشه باعث کند شدن sql میشه. که کارایی رو میاره پایین .
میتونی با روشی که اول گفتم یک زمان هم مشخص کنی که اگر بیش از 30 ثانیه یا یک دقیقه شد به حالت عادی برگرده.

AminSobati
دوشنبه 30 مرداد 1385, 22:40 عصر
آقای باقری درست اشاره کردند. مشکلات همزمانی در این حد که مثلا رکورد در حال ویرایش حذف نشه، توسط خود SQL Server کنترل میشه و سایر مسائلی که در رابطه با همزمانی وجود داره، توسط Isolation Levelها قابل تنظیمه.
اما باید به این نکته ظریف توجه کنید که منظور از "رکورد در حال ویرایش" چیه؟ از دید SQL Server، رکوردی در حال ویرایشه که تحت یک Transaction داره Update میشه و طبیعتا Lock شده. لذا کسی نمیتونه حذفش کنه. اما از دید شما شاید وقتی رکورد رو به Client میبرید و کاربر میخواد ویرایش رو شروع کنه، از دید شما نباید رکورد حذف بشه. ولی چون این رکورد تحت Transaction نیست، SQL Server اون رو Lock نمیکنه و حذف امکان پذیره. Handle کردن این سناریو متاسفانه راحت نیست. یک راهش اینکه که فیلد جدیدی به جدول اضافه کنید و وقتی رکورد به Client برده میشه و قراره ویرایش بشه، مقدار این فیلد برای رکورد مذکور 1 بشه. اگر کسی میخواد حذف انجام بده، مقدار این فیلد رو چک میکنه و اگر 1 بود، پیغام میده که رکورد مورد نظر در حال ویرایشه. وقتی کاربر اول ویرایشش تموم شد، مقدار 1 رو به 0 برمیگردونه. اما مشکل اینجاست که اگر Client مثلا Crash کرد و هیچ وقت 1 رو به 0 تغییر نداد چی؟ شاید ترجیح بدین Socket Programming انجام بدین و موقع حذف، از نرم افزار Client یک تایید بگیرید که آیا واقعا رکورد تحت ویرایش اون قرار داره یا نه....