PDA

View Full Version : ثبت همزمانی اطلاعات در محیط شبکه



zohre66
سه شنبه 30 دی 1393, 07:59 صبح
سلام وصبح همه دوستان به خیر
من می خوام در محیط شبکه وقتی یکی از کاربران داره رکوردی را تغییر می ده برای کاربر دیگه ان رکورد قفل بشه
از google سرچ کردم سایت زیر را پیدا کردم . کوئری ها درسته ولی نمی دونم چطوری عمل می کنه که مطمئن شوم درسته یا نه(روش استفاده)؟؟؟
http://stackoverflow.com/questions/3767328/how-to-perform-a-row-lock

SabaSabouhi
سه شنبه 30 دی 1393, 08:27 صبح
سلام
از Transaction استفاده کن.

صبا صبوحی

zohre66
سه شنبه 30 دی 1393, 09:22 صبح
سلام
از Transaction استفاده کن.

صبا صبوحی

بیشتر توضیح بدید

SabaSabouhi
سه شنبه 30 دی 1393, 12:43 عصر
سلام
با ایجاد یک Transaction عملیات خودتون رو توی اون محدوده کنترل می‌کنید و جداول هم برای دیگران
قفل می‌شن. در پایان با Commit کردن کارهایی که انجام دادین تو دیتابیس نهایی می‌شه و در صورت
Rollback کردن هم دیتابیس بدون تغییر می‌مونه.
توضیح بیشتر رو در انجمن SQL جستجو کنید.

صباصبوحی

zohre66
چهارشنبه 01 بهمن 1393, 06:10 صبح
ممنون خانم صبوحی لطف کردید
اما فکر کنم منظور من را متوجه نشدید . ببنید من می خوام وقتی کاربر داره یه رکورد کار می کنه ان را تا مدتی که ان کاربر داره ویرایش می کنه قفل تا در این مدت کسی دیگه اینکار را انجام نده و یا (مثال دیگه: یه کاربر فرمی جهت اضافه کردن رکورد جدید باز کرده و کاربر 2 هم همینطور یعنی همزمان 2 کاربر فرمی با شناسه 20 باز کردن برای اضافه رکورد جدید تو این مدت کاربر 1 اطلاعتش را ثبت می کنه و رکورد 20 در دیتابیس اضافه می شه و وقتی کاربر 2 می خواد اضافه کنه از انجایی که ثبت و ویرایش من یکی هست و روی این دکمه نوشتم اگر این شناسه وجود عمل ویرایش و در غیرانصورت عمل اینسرت رخ بدهد در اینصورت کاربر 2 رکورد 20 را ویرایش می کنه به جای اضافه کردن)

SabaSabouhi
چهارشنبه 01 بهمن 1393, 07:47 صبح
سلام
این به طراحی دیتامدل شما مربوط می‌شه. اگه منظورت از اون عدد 20 Id جدول‌ها هست که باید با Identity حلش کنی.
و اگه فیلد دیگه‌ای هست که قراره یکتا باشه، با Unique Index جلوی این مشکل رو بگیر.

اگه می‌خوای جلوی ویرایش موازی یک سطر رو بگیری می‌تونی از TimeStamp استفاده کنی.
و در آخر این که من آقای صبوحی هستم :)

صبا صبوحی

zohre66
پنج شنبه 02 بهمن 1393, 06:17 صبح
ببخشید اقای صبوحی
اما متوجه کار TimeStamp چیه
در ضمن دو تا رکورد همزمان توسط دوکاربر ویرایش نشه.کلا همون اول جلوی اینکار را بگیرم به طور مثال وقتی کاربر یک شناسه 5 را برای ویرایش باز کردند کسی دیگه نتونه تاز زمانی کاربر یک کار تموم نشده این شناسه را برای ویرایش باز کنه
یا ایتنکه دو کاربر همزمان می خواهند رکورد جدید ثبت کنند برای هردو شناسه مثلا 20 در نظر گرفنه میشه هر دو قضد ثبت رکورد جدید دارند اما وقتی کاربر یک روی دکمه ثبت کلیک می کنه اطلاعاتش به دیتابیس اضافه می شه ولی وقتی کاربر دو روی دکمه ثبت کلیک می کنه از انجایی این شناسه قبلا ثبت شده بود عملیات ویرایش رخ می ده


متوجه منظورم شدید؟؟؟

SabaSabouhi
پنج شنبه 02 بهمن 1393, 09:27 صبح
سلام
1.TimeStamp
زمان‌هایی پیش میاد که رکوردی وجود داره. کاربر 1 رکورد رو برای ویرایش باز می‌کنه. بعد کاربر 2 هم همون رکورد رو برای ویرایش باز می‌کنه.
کاربر 1 تغییر می‌ده و ذخیره می‌کنه. کاربر 2 هم تغییر می‌ده و می‌خواد ذخیره کنه.
این یکی از مشکلات رایج در بانک‌های اطلاعاتی هست که در این صورت اگر جلوش رو نگیرین، کاربر 2 تغییرات کاربر 1 رو بازنویسی می‌کنه.
حالت بدترش اینه که کاربر 1 رکورد رو حذف کنه و کاربر 2 بخواد تغییرات رو ذخیره کنه.
یک راه حل برای این مورد استفاده از TimeStamp هست. وقتی یک ستون از نوع TimeStamp به جدول اضافه کنید. زمان ذخیره اطلاعات یک
عدد به صورت خودکار توش نوشته می‌شه. ( این ستون اصلاً در اختیار شما نیست ). هنگام ویرایش شما اول رکورد رو می‌خونید. بعد کاربر
ویرایش می‌کنه و هنگامی که می‌خواین کار ذخیره رو انجام بدین، می‌تونین TimeStamp رکورد موجود در Database رو بخونید. اگه رکورد نبود
که می‌فهمین، کاربر دیگه‌ای رکورد رو حذف کرده. و اگر مقدار متفاوت بود، باز متوجه می‌شین که رکورد توسط کاربر دیگه‌ای ویرایش شده و
اگر مقدارش با TimeStamp اولیه‌ای که خودتون خوندین یکی بود، با خیال راحت رکورد رو ذخیره می‌کنین.

2. اگر رکورد رو Lock کنین. ( مثلاً با باز کردن و باز نگه‌داشتن یک Transaction ) اگر کاربر دیگه‌ای بخواد لیست اقلام رو بگیره ( مثلاً لیست کاربران )
گیر می‌کنه و احتمالاً فکر می‌کنه سیستمش Hang کرده! پس این کار اشتباهی هست، دنبال این روش نرین.
و اگر بخواین توی جدولتون با یه flag یا چیزی شبیه به اون باز شدن برای ویرایش رو علامت‌گذاری کنین که دیگه خیلی بدتره، فرض کنید کاربر 1
رکورد رو برای ویرایش باز کنه، بعد به هر دلیلی دستگاهش Reset بشه. . . . رکورد علامت خورده برای ویرایش و . . . این روش هم اشتباهه.

3. امکان نداره برای دو کاربر یک شناسه در نظر گرفته بشه، خیالتون از این راحت باشه. ( فرض می‌کنم منظورتون از شناسه همون Id جدول باشه که
از نوع Identity ) هست. خود Sql Server این رو مدیریت می‌کنه و بر عهده‌ی شما نیست.

صبا صبوحی

zohre66
پنج شنبه 02 بهمن 1393, 10:11 صبح
سلام خیلی ممنون از پاسخ خوبتون
من از یک دکمه برای ثبت و ویرایش استفاده می کنم که به این صورت هم کد نوشته شده . ابتدا بررسی می کنه شناسه که در حال حاضر کاربر باز کرده اگر وجود داره ویرایش و در غیر اینصورت اضافه می کند . (یعنی مشخص نکردم که الان کاربر من در حال ویرایش هست یا اضافه کردن)

zohre66
پنج شنبه 02 بهمن 1393, 10:12 صبح
در ضمن اگر لینک آموزشی برای TimeStamp دارید برام بفرستید اخه من سرچ کردم بیشتر موارد php را دیدم

SabaSabouhi
شنبه 04 بهمن 1393, 08:40 صبح
سلام
1. اگر Id شما صفر بود یعنی Add و در غیر این صورت می‌شه Edit
2. لینک آموزشی دیگه لازم نداره. یه نوع داده در Sql هست. شما یه ستون به دیتابیس خودت اضافه می‌کنی از جنس TimeStamp
هیچ کار دیگه‌ای هم لازم نداره. بقیه‌ی کارها رو خود Sql انجام می‌ده.
فقط چند تا نکته.
* مقدار TimeStamp با هر عمل ( ایجاد رکورد یا ویرایش رکورد ) مقدار جدید می‌گیره
* مقدار TimeStamp از جنس عدد هست.
* مقدار TimeStamp در تمام جدول‌هایی که این ستون را دارند مقدار یکتا دارد.
* شما امکان ویرایش این مقدار رو ندارید، فقط می‌تونید مقدارش رو بخونید.

صبا صبوحی