نمایش نتایج 1 تا 10 از 10

نام تاپیک: قفل کردن رکورد در حال اجرا در شبکه

  1. #1
    کاربر دائمی
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    دیار کریمان کرمان
    پست
    126

    Exclamation قفل کردن رکورد در حال اجرا در شبکه

    با سلام به دوستان عزیز
    من میخواستم بپرسم چه طور میشه که در یک برنامه که تحت شبکه با سی شارپ نوشتم رکوردی که توسط کاربر فعلی هست قفل بشه و تا زمانی که کاربر با این رکورد کار میکنه کسی نتونه با کار کنه
    دیتا بیس در اس کیو است

  2. #2

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    خود MSDE این کار رو میکنه.

  3. #3
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    تهران
    پست
    123

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    این کار اصلا پیشنهاد نمی شود! در برنامه های تحت شبکه برای پرهیز از کار همزمان کاربر ها بر روی یک رکورد اولین چیزی که به ذهن می رسد قفل کردن رکورد است که از طریق قفل کردن جدول و یا toggle کردن یک فیلد از جنس bit قابل اجرا است. اما مشکل اینجاست که چه هنگامی باید رکورد از حالت قفل شده خارج شود؟!
    برنامه همیشه کاملا درست با سناریو های از پیش تعین شده پیش نمی رود. مثلا امکان دارد برنامه hang کند، یا کامپیوتری که به سرور متصل است به هر دلیل reset شود یا اصلا ارتباط با شبکه به صورت نرم افزاری یا سخت افزاری قطع شود، در این صورت برنامه هیچ گاه فرصت unlock کردن رکورد در database را پیدا نمی کند!
    روش های متفاوتی برای handle کردن شرایطی که چند کاربر بر روی یک رکورد کار می کنند وجود دارد، مثل استفاده از socket ها و روش subscrbe کردن کاربر در شبکه های داخلی، یا روش TimeOut برای استفاده از یک رکورد. شخصا استفاده از versioning برای رکورد ها در Database را ترجیح می دهم، به این صورت که هر رکورد شامل فیلد version است که با هر بار تغییر به روز می شود. هنگام ذخیره تغییرات اگر version رکورد در database با version رکوردی که ذخیره می شود متفاوت باشد به این معنی است که رکورد توسط شخص دیگری تغییر کرده است

  4. #4

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    استفاده از version روش خوبي هست
    لطفا در مورد استفاده از socket و روش subscribe يكم توضيح بدين

  5. #5
    VIP
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    www
    سن
    40
    پست
    1,247

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    دوستمون جواب خوبی دادن ولی مشکلی که در روش version هست اینه که ممکنه سناریو به این صورت باشه :
    فرض کنید که برنامه وقت دهی در یک بیمارستان...
    کاربر فرم وقت دهی رو باز میکنه و اولین وقت خالی رو به بیمار پیشنها میده ، انوقت بیمار قبول میکنه و کاربر اطلاعات بیمار رو وارد میکنه و میخواد ثبت کنه که .... از شانس بدش همزمانی اتفاق میافته (حالا اگه متوجه هم زمانی هم بشیم فاییده ای نداره)، حالا بیمار هم که وقت رو ok کرده و رفته.
    فکر میکنم بهترین راه استفاده از socket programing و یا wcf و Remoting از این قبل متد هاست.
    در کل اگه لایه میانی رو در یک ایستگاه نصب کنیم ، میتونیم خیلی راحت و بدون فشار بر روی sqlServer از ماهیت data هامون دفاع کنیم و Validation رو در تمام کلاینت ها مشترک انجام بدیم.

  6. #6
    کاربر دائمی آواتار ASKaffash
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    تهران
    پست
    2,427

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

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

    Set Tran Isolation Level Serializable
    Begin Tran
    Select * From Users With (RowLock) Where UserID=...
    ]

  7. #7
    VIP
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    www
    سن
    40
    پست
    1,247

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    کلا باید فقط در زمان انتخاب سریع از select بدون قفل استفاده کرد.(dirty select)
    بقیه موار نیاز به قفل گزاری داره ، که خود قفل گزاری و انتخاب انواع اون برای case مورد نظر نیاز به تجربه بالا داره .ولی به نظر بنده مسئله همزمانی داده ها باید قبل از sql تشخیص داده بشه.

  8. #8
    کاربر دائمی آواتار Jean Reno
    تاریخ عضویت
    مهر 1387
    محل زندگی
    یه گوشه کوچیک از این دنیای خاکی
    پست
    184

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    می شه از Transaction استفاده کرد

  9. #9
    کاربر دائمی
    تاریخ عضویت
    شهریور 1389
    محل زندگی
    جلوي مانيتور
    پست
    287

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    با سلام
    لطفا در خصوص Socket programin ، wcf و Remoting بیشتر توضیح دهید

  10. #10
    کاربر دائمی
    تاریخ عضویت
    شهریور 1389
    محل زندگی
    جلوي مانيتور
    پست
    287

    نقل قول: قفل کردن رکورد در حال اجرا در شبکه

    نقل قول نوشته شده توسط majid325 مشاهده تاپیک
    فرض کنید که برنامه وقت دهی در یک بیمارستان...
    کاربر فرم وقت دهی رو باز میکنه و اولین وقت خالی رو به بیمار پیشنها میده ، انوقت بیمار قبول میکنه و کاربر اطلاعات بیمار رو وارد میکنه و میخواد ثبت کنه که .... از شانس بدش همزمانی اتفاق میافته (حالا اگه متوجه هم زمانی هم بشیم فاییده ای نداره)، حالا بیمار هم که وقت رو ok کرده و رفته.
    دلیل نداره در این خصوص پس از ثبت مشخصات کار از کار بگذرد!!!!
    برای حل این مشکل دو راه حل وجود دارد :
    1 - قبل از تکمیل مشخصات وقت داده شده به صورت غیر قطعی (فقط به صورت پیشنهاد) اختصاص می یابد و پس از تکمیل تمام مراحل قطعی می شود یعنی مثلا بیمار نباید توقع داشته باشد وقتی که در ابتدای مراجعه به وی پیشنهاد می شود در انتها نیز به طور قطعی به او اختصاص یابد(حالت رقابتی)
    2 - مقادیر غیر قطعی به یک جدول موقت انتقال داده می شوند و براساس این که کاربر حداکثر چقدر زمان لازم دارد تا کلیه مراحل را طی کند و مقدار غیر قطعی تبدیل به قطعی شود یک زمان یا rank به رکورد مزبور اختصاص داده می شود. اگر کاربر دیگری مراجعه نمود اول جدول حاوی مقادیر غیر قطعی چک می شود و از بین رکورد هایی که حداکثر زمان آنها گذشته است یک رکورد به وی اختصاص داده می شود (حالت ثابت با در نظر گرفتن حداکثر زمان در دست داشتن token)

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •