PDA

View Full Version : lock کردن یک فیلد از جدول



poya121
یک شنبه 17 اسفند 1393, 11:17 صبح
سلام
چطور میشه یک سطر از جدول رو lock کرد که هم زمان 2 نفر به این سطر دسترسی نداشته باشند و فقط 1 نفر قادر به تغییر باشه

SabaSabouhi
یک شنبه 17 اسفند 1393, 11:51 صبح
سلام
چطور میشه یک سطر از جدول رو lock کرد که هم زمان 2 نفر به این سطر دسترسی نداشته باشند و فقط 1 نفر قادر به تغییر باشه

سلام
اگه نفر اول رکورد رو که خوند، اون رو قفل کنه، بقیه کاربرها برنامه‌هاشون قفل می‌شه، مثل این که هنگ کرده باشه سیستمشون.
پس نمی‌شه با خوندن رکورد اون رو قفل کرد. بهترین کار اینه که هنگام نوشتن، این کنترل انجام بشه.
یعنی شما یه Transaction باز می‌کنی، مقدار قبلی رکورد رو می‌خونی، با مقدار اولیه‌ای که داشتی مقایسه می‌کنی. اگه تغییری
نکرده بود مقدار جدید رو می‌نویسی و Transaction رو می‌بندی. و اگر هم تغییر کرده بود، به کاربر پیغام خطا رو می‌دی.

اگر نمی‌خوای تمام ستون‌ها رو مقایسه کنی، کافیه تو اون جدول یک TimeStamp بگذاری، و فقط اون رو مقایسه کنی.

صبا صبوحی

poya121
یک شنبه 17 اسفند 1393, 12:03 عصر
میشه یه نمونه کد برام بزارین؟

SabaSabouhi
یک شنبه 17 اسفند 1393, 21:54 عصر
میشه یه نمونه کد برام بزارین؟

سلام
گمان کنم که توضیح پست قبلی واضح بود، اما این هم نمونه کد:


using ( var scope = new TransactionScope() )
using ( var entity = new MyDataContext() ){
try{
var dbItem = entities.MyTable.SingleOrDefault( x=> x.Id = MyItem.Id );
if ( dbItem == null || dbItem.TimeStamp != MyItem.TimeStamp ) {
MessageBox.Show( "Data is changed in database");
return;
}
UpdateDbItem( dbItem, MyItem );
entities.SaveChanges();
scope.Complete();
} catch ( Exception ){
}
}

فرض کردم که MyItem مقداری هست که قبلاً بارگزاری شده و توسط کاربر ویرایش شده. و UpdateDbItem هم تابعی هست که مقدار ستون‌های MyItem
رو روی مقادیر dbItem کپی می‌کنه.

صبا صبوحی