PDA

View Full Version : سوال: استفاده همزمان چند کاربر از سایت و مشکل تداخل تراکنشهای بانک اطلاعاتی



meisam1366
یک شنبه 01 خرداد 1390, 14:15 عصر
سلام دوستان!

یک سوال در مورد استفاده همزمان چند کاربر از یک سایت دارم.

تو یک صفحه ASPX وقتی کاربر برای دریافت تعداد مشخصی کد اکانت، روی دکمه کلیک میکنه، سیستم میره بررسی میکنه ببینه اون تعداد اکانتی که کاربر میخواد تو سیستم هست یا نه (با یه دستور Select Top(@num) * From...) و در صورت وجود تعداد مشخص شده، وضعیت این اکانتها رو تو وضعیت واگذار شده قرار میده تا این اکانتها توسط کاربر دیگه ای دریافت نشه و بعد توی یک جدول واگذاری، آیدی اون اکانتها رو به کاربر نسبت بده.
حالا مسئله اینجاست که اگر این فرایند توی یک سیستم تک کاربره اجرا بشه، مشکلی به وجود نمیآید؛ اما وقتی بخواد روی اینترنت باشه و همزمان چند کاربر بخواهنند تعدادی اکانت رو دریافت کنن، ممکنه تداخلی روی بده و چون احتمال داره توی یک لحضه دو یا چند کاربر روی دکمه دریافت کلیک کنند، احتمال داره یک اکانت به دو کاربر ارائه بشه (چون همونطور که گفتم، اول سیستم میره تعداد اکانتها رو از یک DataTable بررسی میکنه و در صورت درست بودن تعداد، وضعیت همون اکانها رو توی وضعیت واگذار شده قرار میده و مابین همین بررسی تعداد و ثبت وضعیت، ممکنه یک کاربر دیگه، درخواست بده).

حالا دوستان راه حلی برای رفع این مشکل دارن؟؟

ممنون میشم کمک کنید.....

یوسف زالی
یک شنبه 01 خرداد 1390, 14:33 عصر
فکر کنم اگر فیلد Identity داشته باشه یه بار Insert کن و @@identity رو برگردون.
هر تعداد آدم هم بیان درست کار می کنه.
حالا تو دستور Update با شرط @@identity دستور قبلیت فیلتر کن.

kabir_eng
یک شنبه 01 خرداد 1390, 15:25 عصر
سلام
میتونی اول یه شی تو global درست کنی که username ها یا اکانت ها در حال ثبت رو به طور مقطعی نگهداری کنه بعد هم ابتدا عدم رزرو بودن user چک بشه بعد امکان ثبتش تو دیتا بیس .

meisam1366
یک شنبه 01 خرداد 1390, 16:16 عصر
دوستان عزیز، از راهنمایی که کردین خیلی ممنونم!

اما آیا با استفاده از StoredProcedure ها میشه جلوی این تداخل رو گرفت؟
مثلا خود StoredProcedure تعداد رو بررسی کنه و اگر درست بود، وضعیت اکانتها رو Update کنه؟
مثل کد زیر:


CREATE Procedure [dbo].[sp_Products_UpdateStatuse]
@Max int,
@Statuse int,
@NewStatuse int
As

Begin

Declare @tip Table(ids int)

Insert into @tip
Select Top(@Max)
[ID]
From Products
Where
[Statuse] = @Statuse


if (Select COUNT(ids) from @tip) = @Max
Begin
Update Products
Set [Statuse] = @NewStatuse
Where [ID] in (select ids From @tip)

Select * From @tip
End

else
Begin
return 0
End

End

آیا در بانک اطلاعاتی SQL Server ، زمانی که یک StoredProcedure در حال اجراست، StoredProcedure دیگری میتواند اجرا شود یا در صف قرار میگیرد؟؟

چون اگر StoredProcedure دیگری اجرا نشود، دیگه مشکل حل است.

.