نظرسنجی درباره Lock کردن رکوردها
سلام دوستان. من برای lock کردن رکوردها به نظرم رسید که یک جدول داشته باشم با دو تا فیلد یکی شماره سند یا فاکتورها یکی هم نام کاربر.هروقت کاربری خواست رکوردی رو اصلاح کنه اون شماره سند رو با نام کاربر در جدول اضافه کنه.بعد از اینکه کاربر تائید کرد اون رکورد رو از جدول پاک کنه.هنگامی که کاربر دیگه ای هم خواست اون رکورد رو اصلاح یا حذف کنه بهش پیغام میده.
اگر هم سیستم crash کرد در برنامه یک گزینه قرار میدهیم برای unlock کردن رکوردها.که با زدن اون تمام محتویات جدول پاک خواهد شد.فکر کنم این بهتر از lock کردن خود sql هست.و به نظر من سربارش کمتره.درسته؟
منتظر نظرات سازنده اساتید هستم
نظرسنجی درباره Lock کردن رکوردها
درصورتيكه تمامي كاربران با sa به sql server وارد شوند، مي توان از اطلاعات كمكي ديگري مثلا نام كاربري ويندوز آنها استفاده كرد؟:متفکر:
نقل قول: نظرسنجی درباره Lock کردن رکوردها
نقل قول:
نوشته شده توسط
whitehat
منظورم وقتی است که دو کاربر تائید را بزنند ، در آن زمان هر دو می توانند مرحله اول که چک کردن Lock شدن توسط دیگری است ،را با موفقیت به پایان برسانند و بعد هر دو edit کنند (امیدوارم درست متوجه شده باشم)
اگر شما از Transaction استفاده کنید براحتی می توانید این کار را مدیریت کنید، در زمانی که یک تراکنش انجام می شود تراکنش دیگر قادر به اجرا نیست (می تواند Rollback شود یا منتظر بماند) در این حال تراکنشی موفق تر است که زودتر اجرا شود. در ضمن حتما این کار را طرف Server (مثلا با استفاده از SP) انجام دهید و در صورت Fail شدن یکی نتیجه را به Clientها اعلام کنید.
ممکن توضیح بدین چرا حتما این کار باید طرف سرور انجام بشه ؟
نقل قول: نظرسنجی درباره Lock کردن رکوردها
يک سوال:
آيا SPID در کل زمان زندگي ديتابيس سرور ( از لحظه نصب اون الي الابد!) منحصر به فرده يا فقط در زماني که ديتابيس سرور سرپا است؟
اميدوارم منظورم رو متوجه شده باشين.
مقصودم اينه که آيا هر بار که يک کانکشن به ديتابيس سرور زده مي شه، SQL Server يه SPID کاملاً جديد که اصلاً قبلاً وجود نداشته توليد مي کنه و به کانکشن جديد مي ده يا ممکنه عددي رو بهش بده که قبلاً هم در گذشته ممکنه مال يک پروسه ديگه بوده که تموم شده و رفته؟
اگه جواب منفي باشه، يعني SPID در Life Time ديتابيس سرور منحصر به فرد نباشه، به نظرم الگوريتم بررسي SPID نياز به اين داره که با يه چيزي مثل يه فيلد DateTime، منحصر به فرد بودن SPID رو تضمين کنيم تا يک کاربر اشتباهاً رکورد در حال ويرايش يک کاربر ديگه رو ويرايش نکنه.
اين سناريو ممکنه خيلي بعيد به نظر بياد اما غير ممکن هم نيست:
کاربر با SPID برابر 55 وارد مي شه و شروع به اديت مي کنه. بعد Crash مي کنه. رکورد از نظر منطقي (از نظر سازنده برنامه) قفل شده. مدتي بعد سرور به هر دليلي ريستارت مي شه. بعد از بالا اومدن مجدد سرور، يه کاربر ديگه Login مي کنه و مي خواد رکورد رو ويرايش کنه، از قضا SQL Server دقيقاً همون شماره 55 رو به SPID اش مي ده. لذا وقتي برنامه مي خواد بررسي کنه که آيا اين رکورد قفل هست يا نه فکر مي کنه که رکورد قفل نيست، چون SPID خودش رو توش مي بينه. البته شايد در همين لحظه هم بشه قضيه رو فهميد، چون طبعاً وقتي کسي مي خواد اقدام به ويرايش يک رکورد بکنه، طبعاً يا فلگ بايد NULL باشه يا يک SPID موجود در SP_WHO به جز SPID خودش در اون باشه.
نکته بسيار مهم قضيه که به نظرم بايد بهش دقت کرد اينه که روش Transaction هميشه عملي نيست، خصوصاً وقتي پاي چندين سيستم جدا از هم مطرح باشه. سيستم بانک هاي عضو شتاب رو ببينيد. شما مثلاً با کارت بانک ملي به دستگاه بانک تجارت مراجعه مي کنيذ مي خوايد پول برداشت کنيد، پول از حساب شما کسر مي شه اما دستگاه يهو به دليل يه مشکل و نقص فني مکانيکي يا هر دليل ديگه به شما پول نمي ده. حتماً برخورد کرديد يا شنيديد که پول به حساب تون بر مي گرده ولي با تاخير يک هفته اي. در چنين مواردي نمي شه از Transaction هم استفاده کرد و بايد از روش هاي ابتکاري استفاده کرد مثل پيشنهاد مهندس ثباتي.
اين مطلب مشابه بحث مديريت پردازه ها و همروندي در درس سيستم عامل هستش که الگوريتم هاي مختلفي توسط افراد مختلف به منظور جلوگيري از بن بست (Dead Lock) پيشنهاد داده شده. همه هم روش هاي ابتکاريه.
لذا به نظر من هيچ امتناعي از ابداع راه هاي ابتکاري نبايد داشت و نبايد فکر کرد که حتماً يک شرکتي، يک محصولي قبلاً امکاني براي اين کار فراهم کرده باشه و اونو حل کرده باشه.
به عقيده من چيزي که مهمه و صد در صديه الگوريتمه يک کاره. اگه يک الگوريتم درست باشه، سناريوهاي مختلف رو بتونه جواب بده که دچار بن بست نشه، ديگه روش پياده سازي مهم نيست. مي خواد يکي توي SQL Server براي Lock کردن منطقي رکوردهاي برنامه اش ازش استفاده کرده باشه، مي خواد توي مبحث سيستم عامل براي جلوگيري از بن بست پردازه ها در استفاده از منابع (Resource) ها استفاده کرده باشه.
من به شدت توصيه مي کنم حتماً مبحث مديريت پردازه ها در سيستم عامل و الگوريتم هاي مختلف جلوگيري از بن بست رو مطالعه کنيد.
خيلي بهتون ديد مي ده.
و يک چيزي که به نظرم مي تونه به الگوريتم پيشنهادي مهندس ثباتي اضافه بشه، ايجاد يک Job هست که مثلاً هر 1 دقيقه اجرا بشه و وضعيت پردازه هاي جاري و رکوردهاي قفل شده رو بررسي کنه تا بتونه بن بست ها بر طرف کنه.
نقل قول: نظرسنجی درباره Lock کردن رکوردها
من حوصله نداشتم همه رو بخونم.
ولی روشی که من خودم در چنین شرایطی ممکنه استفاده کنم اینه که وقتی سیستم کاربر crash کرد در login بعدی همه lock های ایجاد شده توسط اون کاربر حذف بشه.
به همین راحتی.
نقل قول: نظرسنجی درباره Lock کردن رکوردها
سلام.البته یک نکته رو گوشزد کنم اونم اینه که این تاپیک مربوط به سال 86 هست.فکر میکنم تاحالا مشکل حل شده باشه.
در مورد SPid که فرمودید هر دفعه که یک User از سرور خارج میشه و user دیگه ای login میکنه ممکنه همون Spid رو بگیره.ولی نام کامپیوترش زمان login و خیلی پارامترهای دیگه اون با Spid های قبلی متفاوت هستند.
یکی از مناسبترین راهها استفاده از فیلدهای Timestamp هست برای اینکه متوجه بشیم ایا رکورد مورد نظر تغییری کرده یانه.زیرا در هربار تغییر مقدار آن متفاوت خواهد بود.
همچنین میتوان لاگ تغییرات اون و اینکه توسط چه کاربرانی تغییر کرده رو نیز ذخیره کرد.
روشهای زیادی موجود هست که بستگی به حساسیت پروژه و سبک کاری پروژه میتوان ازش استفاده کرد.
موفق باشید