Мой сценарий: n количество записей в таблице, потоки пытаются получить доступ к таблице. Один должен получить первый номер и удалить его, другие должны получить второй, третий и т. Д. Один за другим.
Но проблема в том, что некоторые потоки получают одинаковое число. Как мне избежать этого?
Мой код:
private void Form1_Load(object sender, EventArgs e)
{
for (int j = 1; j >= 10; j++)
{
Thread.Sleep(1000);
ThreadStart StarterCon = delegate { this.Start_new(sno); };
Thread th = new Thread(StarterCon);
th.Start();
}
}
private void Start_new(int h)
{
try
{
for (; ; )
{
using (SqlConnection ObjConn = new SqlConnection(ConnectionString))
{
ObjConn.Open();
using (SqlDataAdapter ObjAda = new SqlDataAdapter("Select_BlockedNubmer", ObjConn))
{
ObjAda.SelectCommand.CommandType = CommandType.StoredProcedure;
SqlParameter parm;
parm = ObjAda.SelectCommand.Parameters.Add("@id", SqlDbType.NVarChar);
parm.Value = h;
using (DataTable dtTable = new DataTable())
{
ObjAda.Fill(dtTable);
}
}
ObjConn.Close();
}
Thread.Sleep(500);
}
}
catch { }
}
Моя хранимая процедура
Create procedure [dbo].[Select_BlockedNubmer]
@id varchar(max)
as
begin
set rowcount 1
select * from BlockedNumber
delete from BlockedNumber
set rowcount 0
end
Редактировать: я пробовал следующую хранимую процедуру. Он работает нормально, но чтение числа очень и очень медленно:
ALTER procedure [dbo].[Select_BlockedNubmer]
@id varchar(max)
as
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin transaction
set rowcount 1
select * from BlockedNumber
delete from BlockedNumber
set rowcount 0
commit transaction
end