ورود

View Full Version : دستور xlock در sql server



M.Hashemi
یک شنبه 21 شهریور 1389, 23:25 عصر
با سلام
من یک stored procedure در sql دارم که عمل update را انجام می دهد.
حال می خواهم کدی در این stored procedure بنویسم که اگر دو نفر هم زمان ان را اجرا کردند ان ها را به صف کند و یکی وارد stored procedure شود و تا زمانی که کارش تمام نشده نفر بعدی نتواند وارد stored procedure شود اما زمانی که کارش تمام شد نفر بعدی بتواند وارد stored procedure شود.
در اینترنت گشتم و دستور set transaction isolation serializable را پیدا کردم.
اما نمیدونم به چه روشی باید تستش کنم.
حال از اساتید محترم 2 سوال دارم :
1- ایا این دستوری را که پیدا کردم همین کار را انجام می دهد؟ اگر نه لطف کنید و دستورش را بنویسید!
2- از چه روشی باید این مسئله را تست کنم؟
با تشکر

بهزادصادقی
دوشنبه 22 شهریور 1389, 01:13 صبح
از isolation level در سطح serializable نباید استفاده کرد، مگر اینکه واقعا چاره دیگری نداشته باشید. راه های مختلفی برای حل چنین مسائلی وجود دارد. اینکه کدام به درد شما می خورد بستگی دارد به اینکه stored procedure شما دقیقا دارد چه کار می کند. اگر مقدور است، کدش را اینجا به صورت جامع و کامل درج نمائید، و ساختار تمام جداول استفاده شده را نیز ذکر نمائید و من و دوستان سعی خواهیم کرد کمکتان کنیم.

M.Hashemi
دوشنبه 22 شهریور 1389, 11:16 صبح
با سلام
ساختار جداول برنامه بزرگ هستن و من یک مثال کوچکمثل جداول مربوط به برنامه می اورم:
جدولی که دارای دو فیلد id(nchar(14), name (nchar(10) که در این جدول فیلد id ویژگی primary key را دارد.
حال ساختار stored procedure مربوط به عمل insert به صورت زیر است :


create procedure insert_table
@auto bit,
@year nchar(4),
@id nchar(14),
@name nchar(10)
as
declare @count int
if @auto = 0
begin
select @count = COUNT(*)
from [dbo].[Table_1]
where id = @id
if @count = 0
insert into [dbo].[Table_1] (id, name)
values (@id, @name)
end
else
begin
declare @id2 nchar(10)
set @id2 = '1'
while 1 = 1
begin
select @count = COUNT(*)
from [dbo].[Table_1]
where id = @year + @id2
if @count > 0
set @id2 = CAST(@id2 as bigint) + 1
else
begin
set @id = @year + @id2
break;
end
end
insert into [dbo].[Table_1] (id, name)
values (@id, @name)
endدر اینجا کاربر برای insert می تواند خودش کدی را به عنوان id وارد (کند که در این صورت باید @auto را با 0 مقداردهی بکند) یا id را سیستم خودکار وارد کند (متغییر @year مربوط به سال است مثلا 1389 و این کد به این صورت کار می کند که ابتدا کد سال و سپس یک عدد را وارد می کند و اگر وجود نداشته باشد ان را ذخیره و در غیر این صورت یک واحد به ارقام بعد از سال وارد می کند به این صورت که 1389200 یعنی این فرد در سال 1389 عضو شده و نفر 200 بوده که عضو شده)
- ببخشید اگر در sql مبتدی کار کردم (خیلی وقت نیست که دارم با sql کار میکنم)
و ساختار مربوط به update به صورت زیر است :


create procedure update_table
@id nchar(14),
@name nchar(10)
as
declare @count int
select @count = COUNT(*)
from [dbo].[Table_1]
where id = @id
if @count = 0
begin
insert into [dbo].[Table_1] (id , name)
values (@id, @name)
end
و ساختار مربوط به delete به صورت زیر است :


create procedure delete_table
@id nchar(14)
as
delete from [dbo].[Table_1]
where id = @idبا تشکر

بهزادصادقی
دوشنبه 22 شهریور 1389, 15:45 عصر
جناب هاشمی، راستش را بخواهید کد شما آنقدر مشکل اساسی دارد که من فرصت نخواهم داشت اینجا در موردش به صورت کتبی بحث کنم. اگر می خواهید یک pm (پیغام خصوصی) به من بزنید و ما می تونیم ترتیب این را بدهیم که تلفنی خدمت شما باشم.

M.Hashemi
دوشنبه 22 شهریور 1389, 17:22 عصر
با سلام
از اقای بهزادصادقی متشکرم.
چون من کمتر از 20 پست دارم سیستم من را محدود کرده و من نمی توانم به شما pm بدهم.
اگر ممکنه شماره تماستون را به EMail من بفرستید من با شما تماس بگیرم.
M.Hashemi2007@GMail.com
با تشکر