View Full Version : ثبت دو رکورد مشابه
fatemeh rahimi
یک شنبه 03 شهریور 1387, 18:08 عصر
سلام،من در سیستمم به ازای هر پرونده که ثبت میشه یه شماره پرونده دارم که موقعی که فرم پرونده جدید رو باز میکنم به صورت اتوماتیک پر میشه، اگر چند نفر همزمان با هم فرم جدید رو باز کنند تو فرم همه اونها یه شماره پرونده میاد و موقع ثبت اگر یه نفر زودتر ثبت کنه،نفر بعدی نمیتونه شماره پرونده تکراری ثبت کنه وپیغام میده و اتوماتیک شماره پرونده جدید رو به اون میده و بعد ثبت میکنه، حالا مشکل اینجاست که اگه دو نفر دقیقا همزمان با هم ثبت کنند دیگه چک نمیکنه وشماره پرونده تکراری ثبت میشه!اگه یکی یه ثانیه زودتر هم ثبت کنه ،کنترل میشه، ولی اگه دقیقا همزمان با هم باشه کنترل نمیکنه چون هر دو Query با هم اجرا میشن،چطور میتونم این مشکل رو حل کنم و کنترل داشته باشم؟راهی برای lock کردن db هست؟
جایی که سیستمم داره اونجا کار میکنه چند تا اپراتور داره که در جاهای مختلف هم هستند و این مشکل ممکنه خیلی به وجود بیاد ، مجبورم کنترل داشته باشم اما نمیدونم چطوری؟
اگه راهنمایی کنید ممنون میشم.
رضا عربلو
یک شنبه 03 شهریور 1387, 18:18 عصر
تا هنگامی که پرونده ای ثبت نشود نمی توان و نبایستی شماره آن را مشخص کرد. و پس از ثبت می توانید شماره پرونده را به کاربرتان نشان دهید.
اگر می خواهید شماره تان به ترتیب باشند نیز بهتر است همواره آخرین شماره را در یک جدول دیگر نگهدارید و هر بار پس از درج یک رکورد جدید یکی به مقدار آن اضافه کنید. هرچند اگر مطمئن هستید که درج رکوردتان بدون هیچ خطايي همواره رخ می دهد می توانید از فیلد AutoUncrement استفاده کنید.
fatemeh rahimi
یک شنبه 03 شهریور 1387, 18:30 عصر
شماره پرونده ام که به ترتیب اضافه میشه،و بنا به دلایل و شرایطی که خواست کاربر هست شماره باید قبل از ثبت روی فرم بیاد اما به ترتیب به شماره یه واحد اضافه میشه،در جدول هم ذخیره میشه و موقع ثبت هم اول میاد چک میکنه اگه در جدول چنین شماره ای نیست بعد ثبت میکند،اما این در مواردی که دقیقا همزمان ثبت میکنند درست عمل نمیکند چون هر دو همزمان هستند query هایشان همزمان اجرا میشه و چون اون شماره هنوز در جدول ثبت نشده،کنترل نمیکنه!
حالا چیکار باید بکنم در مواقعی که دقیقا همزمان ثبت میکنند و یه query همزمان اجرا میشه؟این مشکل برای اپراتور ها به وجود اومده و باعث بروز مشکلات شده!
رضا عربلو
یک شنبه 03 شهریور 1387, 21:57 عصر
Lock کردن دیتابیس یا جدول را فراموش کن (هنگامی که release کردن آن به کاربر سپرده می شود و نه اتمام یک سری عملیات).
در صورتی که مطمئن هستید هنگامی که یک کاربر دکمه جدید را می زند یک شماره به پرونده تان اختصاص می یابد که کاربر مجبور است آن را پر کند می توانید هنگامی که یک کاربر دکمه جدید را زد یک رکورد در دیتابیس درج کنید (با مقادیر خالی یا پیش فرض) و سپس هنگامی که کاربر دکمه تایید را زد آنرا update کنید. البته بهتر است یک function بنویسید که برنامه تان از آن شماره پرونده می گیرد و در صورتی که شماره ای آن وسط ها خالی ماند آنرا به اولین عمل درج اختصاص دهد و اگر شماره پرونده ای در آن وسطها بلا استفاده نمانده بود می تواند آخرین شماره + 1 را برگرداند
رضا جاسبی
یک شنبه 03 شهریور 1387, 22:55 عصر
راه زیاد وجود داره. بهترینش اینه که از StoredProcedure استفاده کنید. اینطوری همه کاربران روی یک سرور کار می کنند. اما باز هم شاید همزمانی اذیت کنه. البته من امتحان نکردم ولی فکر می کنم مشکلی نباشه. شما می تونی از Transaction استفاده کنی. اینطوری زمان تغییرات جدول مربوطه (یا شاید هم بشه فقط رکورد مربوطه) Lock میشه. و البته هرگز هرگز نباید فراموش کنی که بعد از عمل Insert یا هر تغییر دیگر باید Commit کنی و یا اگر عملی موفق نبود rollback کنی. اینطوری قبل از شروع می تونی یک پیغام در حال ثبت بهش نشون بدی و با اتمام عملیات اون پیغام رو اتوماتیک پاک کنی. عمل Release هم به قول آقا رضا به کاربر سپرده نمیشه بلکه با اتمام عملیات شما خودت در برنامه Commit یا Rollback می کنی.
اما شما گفتی که به خواست مشتری باید یک شماره بهش نشون بدی. خوب اگر اون شماره رو نتونی ثبت کنی با پیغام خطا بهش شماره جدید میدی ؟؟؟
درسته که Customer is King و نظراتش باید اعمال بشه اما Developer باید این توان رو داشته باشه تا نظرات غیر منطقی یا مشکل دار اون رو وتو کنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.