PDA

View Full Version : سوال: درج همزمان اطلاعات توسط 2 کاربر در یک جدول



c#_web
دوشنبه 10 تیر 1387, 09:30 صبح
با سلام .
من یک مشکل اساسی دارم و آن اینست که در یکی از فرمهای برنامه ام ممکن است در شبکه در یک زمان مشخص 2 یا چند نفر فرم مزبور را باز کرده و بخواهند درج اطلاعات کنند.
البته برای درج اطلاعات از stored rocedure استفاده کرده ام که در زیر آنرا میگذارم.
حالا اگر دریک زمان همه وارد شده و با اختلاف میلی ثانیه ای اطلاعات را وارد کنند مشکل اینست که یکی را ثبت کرده و درآخر ، آخرین مورد را روی آن قبلی ثبت میکند. نه اینکه به ازاء هر کدام سطر جداگانه.
که مشکل جدی هم هست و همه اطلاعات 2 یا چند کاربر دیگر که دراین فرم اطلاعات وارد کرده بودند از بین میرود.
البته من در stored rocedure ی که استفاده کرده ام ابتدا ماکزیمم کد را پیدا کرده و سپس با این کد ماکزیمم اطلاعات را درج میکنم.
حالا مرا راهنمایی کنید مشکل از کجاست؟ چگونه رفع مشکل کنم؟


create procedure UpdateTbl(@codeTbl nvarchar(25),...,@rerult)
as
declare @code nvarchar(25)
select @code =cast(max(codeTbl )+1 as nvarchar(25)

if @result=0
if isnull(codeTbl ,'')=''
begin insert into tbl05 (codeTbl ,..) values(@code,..)
end
else if isnull(codeTbl ,'')<>''
begin
update tbl05
set codeTbl=@codeTbl , ..... where codeTbl =@codeTbl
end
end
select result




حالا در برنامه در دات نت این stored procedure را صدا زده و اگر حاصل select به صورت
ds.tables[0].rows[0][0].tostring)=="0"
یعنی خطا نداده و درج میکند اما اگر 1 بود یعنی خطا داشته حالا دستور تلاش مجدد میدهد.
ولی هرگز این خطا را نداده و درج مجزا در سطرهای مجزا هم نمیکند.
لطفا راهنمایی کنید برای حل مشکل درج همزمان دریک جدول چه باید کرد؟

KavoshGar_ir
دوشنبه 10 تیر 1387, 23:55 عصر
سلام دوست من!
با مشکل همزمانی از Transaction ها کمک بگیرید! پیاده سازی این ترانزاکشن ها در Sql و هم از قابلیتهای ADO.NET امکان پذیر است! در این مورد جستجو کنید.

c#_web
سه شنبه 11 تیر 1387, 12:05 عصر
مشکل من اینه که خطا برای همزمانی نمیدهد . و اطلاعات را درج کرده اما چون اطلاعات را پشت سرهم در آن واحد وارد کرده اند دومی را روی قبلی میریزد.
به عبارتی برای هر 2 کد ماکزیممی که در نظر گرفته است یکی است. مثلا کد ماکزمم را 5 گرفته یک سطر ثبت کرده و برای بعدی هم چون همزمان وارد شده اند و هنوز نفر قبل ثبت نکرده پس خطا نداده و برای نفر دوم هم کد ماکزیمم را 5 گرفته و بنابراین چون کددارد آنرا update میکند.
حالا من برای رفع مشکل چه کار کنم؟؟

KavoshGar_ir
سه شنبه 11 تیر 1387, 16:43 عصر
مشکل من اینه که خطا برای همزمانی نمیدهد . و اطلاعات را درج کرده اما چون اطلاعات را پشت سرهم در آن واحد وارد کرده اند دومی را روی قبلی میریزد.
به عبارتی برای هر 2 کد ماکزیممی که در نظر گرفته است یکی است. مثلا کد ماکزمم را 5 گرفته یک سطر ثبت کرده و برای بعدی هم چون همزمان وارد شده اند و هنوز نفر قبل ثبت نکرده پس خطا نداده و برای نفر دوم هم کد ماکزیمم را 5 گرفته و بنابراین چون کددارد آنرا update میکند.
حالا من برای رفع مشکل چه کار کنم؟؟
شما در مورد پست دوم من سرچ کردی؟!

اگر از ترانزاکشن ها استفاده کنی یک کاربر اگر در حال اینزرت باشه بر روی فیلد 4 کاربر دوم حق استفاده از فیلد 4 را ندارد تا کاربر اول کار عمل درج آن با موفقیت انجام شود! بعد از کاربر اول کاربر دوم اگر درخواست اینزرت دهد فیلد 5 برای آن باز خواهد شد.

اما اگر مورد فوق راه حل شما نبود! باید ستون را ایندکس بگیرید! به عبارتی مقدار آن یونیک یا یکتا شود!که در این صورت هم مشکل همزمانی تحت شرایطی بر طرف میشه ...

مگر اینکه دیتابیس مورد استفاده شما اکسس باشد!که خداوند عاقبت شما را ختم به خیر فرماید!:اشتباه:

Neo Persian
چهارشنبه 12 تیر 1387, 02:26 صبح
در ضمن براي بدست آوردن آخرين ID از SCOPE_IDENTITY() استفاده كنيد لازم به نوشتن اون كد ها نيست


SELECT SCOPE_IDENTITY() FROM tbl

c#_web
پنج شنبه 13 تیر 1387, 20:35 عصر
با تشکر از هردوی شما دوستان.
بالاخره با transactionبه نتیجه رسیدم.
ممنون