PDA

View Full Version : مشکل همزمانی در ویراش و حذف رکوردها



sh
شنبه 27 مرداد 1386, 22:55 عصر
سلام

دو کلاینت در نظر بگیرید A , B

هر دو برنامه رو اجرا میکنند و یک دیتاگرید که به DataSet بایند شده و توسط TableDataAdapter پر شده رو نمایش میدهند

کلاینت A رکورد سوم دیتاگرید رو ویرایش میکنه در همون حال رکورد کلاینت B میخواد اون رو پاک کنه آیا با توجه به اینکه SQlExpress با CRL کار میکنه راهی هست از طریق دات نت این عملیات کنترل بشه یا خود SQLExpress بتونه این کار رو انجام بده ؟

توجه داشته باشیم که در دات نت ویرایش داده ها غالبا در حالت Disconnected و درون DataSet اتفاق میوفته و یجوری ما باید بدونیم که در دیتا ست فلان کلاینت فلان رکورد داره ویرایش میده و همون در دیتا بیس تا پایان ویرایش قفل بشه

امیدوارم متوجه منظور شده باشید

منتظر راهنمائی و نظرات شما هستم

mhadvi_mahmaood
شنبه 27 مرداد 1386, 23:32 عصر
اگر شما بخواهید رکوردی را که در دیتاست در حال ویرایش است قفل کنید یک فاجعه در همزمانی کاربران رخ میده. آخه تا کی رکورد قفل بشه؟ بعشدم وقتی که رکورد قفل بشه دیگه سلکت هم نمیشه زد.
یک راه هست که وقتی که میخاید رکورد رو آپدیت کنی ببینی قبلا" بلایی سرش اومده یا نه. که اگر بخای اینکارو بکنی باید از timeStamp استفاده کنی.

پویا
یک شنبه 28 مرداد 1386, 12:46 عصر
راه حل اصولیشو نمیدونم ولی اگه من بودم یک فیلد به جدولم اضافه می کردم به اسم Lock. وقتی می خواستم ویرایشش کنم اونو یک می کردم و وقتی کارم تموم شد صفر می کردم
تو دستور حذف هم چکش می کردم که اون فیلد یک نباشه

sh
یک شنبه 28 مرداد 1386, 15:22 عصر
دوست اولی منظور منو متوجه نشد

جناب پویا این کار ابتدائی به ذهنم اومده ولی راه حل منطقی نیست . باید راه حل اصولی وجود داشته باشه

mhadvi_mahmaood
یک شنبه 28 مرداد 1386, 16:18 عصر
دوست اولی منظور منو متوجه نشد
شما خودتون اشاره کردید که دارید در حالت Disconected کار میکنید.
اینکارشما شبیه اینه که به دو نفر دوتا لیست بدند و بگویدند هرتغییراتی که دلتون مخیواد بدید. و بعد بیارید اینجا ثبتش کنید. حالا که لیست ها رو بردند خونه ما از کجا بدونیم که چه تغییراتی داره انجام میشه؟

sh
یک شنبه 28 مرداد 1386, 18:18 عصر
راجب Optimistic Concurrency تحقیق کن

mhadvi_mahmaood
دوشنبه 29 مرداد 1386, 00:04 صبح
این موضوع چه ربطی داره به سوال شما؟ مگر شما همزمانی رو توی خود SQL Server مورد سوال قرار دادی؟

sh
دوشنبه 29 مرداد 1386, 15:03 عصر
من دنبال جلوگیری از این کار هستم چه از طریق دیتا ست چه توی خود دیتابیس

mhadvi_mahmaood
دوشنبه 29 مرداد 1386, 15:57 عصر
من دنبال جلوگیری از این کار هستم چه از طریق دیتا ست چه توی خود دیتابیس
من هرجوری فکر میکنم می بینم اینی که شما گویی نوشه.:افسرده:

supporter
چهارشنبه 31 مرداد 1386, 22:26 عصر
امیدوارم منظورتون رو درست متوجه شده باشم
می تونید یک فیلد RowVersion به جدولتون اضافه کنید موقع Fetch این فیلد رو هم بگیرید و موقع Update و Delete به این شکل عمل کنید:



Update TableName
SET F1 = Value1, F2 = Value2, RowVersion = RowVersion + 1
WHERE Condition
And RowVersion = @RowVersion -- مفدار گرفته شده به هنگام واکشی رکورد
If @@RowCount <>1 Print 'رکورد تغییر یافته'


DELETE From TableName
WHERE Condition
And RowVersion = @RowVersion -- مفدار گرفته شده به هنگام واکشی رکورد


If @@RowCount <>1 Print 'رکورد تغییر یافته'

روشنه که اگه مغایرتی بین رکورد مورد نظر به هنگام Fetch و Update یا Delete وجود داشته باشه امکان Update یا Delete اون وجود نخواهد داشت.

SMRAH1
پنج شنبه 01 شهریور 1386, 01:28 صبح
سلام

اگر دقت کرده باشید دربیشتر برنامه ها ،مود نمایش داده ها با وضعیت حذف یا ویرایش متفاوت است (یعنی باید گزینه ای رو فعال یا غیر فعال کنی یا اصلا بری توی یک دیالوگ دیگه).در واقع زمانی که شما در خواست تغییر در دیتابیس رو دارین،پایگاه داده باید آماده بشه.این آمادگی توسط نوع بازشدن دیتابیس (connection string) است که مشخص میکنه آیا یک snapshot باشه یا ...

من با دات نت خیلی آشنا نیستم ولی فکر کنم برای این مواقع یاید حتما حالت اتصال به پایگاه داده عوض بشه (البته به صورت موقت) تا دیگر کاربر ها نتوانن در داده ها تغییر ایجاد کنند.

موفق باشید

mhadvi_mahmaood
پنج شنبه 01 شهریور 1386, 13:18 عصر
مگر خود sql server ابزار کافی و قوی برای کنترل همزامانی کاربران ندارد که ما بیاینم توسط کلاینت این ابزار رو ایجاد کنیم

رضا عربلو
پنج شنبه 01 شهریور 1386, 16:49 عصر
با توجه به سناریوی کهگفتید تنها راهی که به نظرم می رسد یک فیلد قفل با یک فیلد Lock Timeout است.
در صورتی که این تایم اوت برسد قفل برداشته شود