このようなシナリオ:テーブルに挿入する一定量のデータ、しきい値に達しなくなったときに、このシナリオをシミュレートしました。マルチスレッドの場合は例えばasp.net)は同時に発生した問題を抱えていました。ado.netで同時実行の競合を解決する方法
私の質問は
void Main()
{
Enumerable.Range(0,20).ToList().ForEach(i=>{
MockMulit();
});
}
//Start a certain number of threads for concurrent simulation
void MockMulit()
{
int threadCount=100;
ClearData();//delete all data for test
var tasks=new List<Task>(threadCount);
Enumerable.Range(1,threadCount).ToList().ForEach(i=>{
var j=i;
tasks.Add(Task.Factory.StartNew(()=>T3(string.Format("Thread{0}-{1}",Thread.CurrentThread.ManagedThreadId,j))));
});
Task.WaitAll(tasks.ToArray());
CountData().Dump();//show that the result
}
方法1 lock
ケースを使用していない、同時問題の解決方法である - 同時実行、非常に深刻な
void T1(string name)
{
using(var conn=GetOpendConn())
{
var count=conn.Query<int>(@"select count(*) from dbo.Down").Single();
if(count<20)
{
conn.Execute(@"insert into dbo.Down (UserName) values (@UserName)",new{UserName=name});
}
}
}
は方法2 - 一緒にSQLを置く減らすことができます同時に、しかしまだ存在する
void T2(string name)
{
using(var conn=GetOpendConn())
{
conn.Execute(@"
if((select count(*) from dbo.Down)<20)
begin
--WAITFOR DELAY '00:00:00.100';
insert into dbo.Down (UserName) values (@UserName)
end",new{UserName=name});
}
}
方法3 - ロックd同時をestroy、私はそれが最善の解決策
private static readonly object countLock=new object();
void T3(string name)
{
lock(countLock)
{
using(var conn=GetOpendConn())
{
var count=conn.Query<int>(@"select count(*) from dbo.Down").Single();
if(count<20)
conn.Execute(@"insert into dbo.Down (UserName) values (@UserName)",new{UserName=name});
}
}
}
他のヘルプ方法
//delete all data
void ClearData()
{
using(var conn=GetOpendConn())
{
conn.Execute(@"delete from dbo.Down");
}
}
//get count
int CountData()
{
using(var conn=GetOpendConn())
{
return conn.Query<int>(@"select count(*) from dbo.Down").Single();
}
}
//get the opened connection
DbConnection GetOpendConn()
{
var conn=new SqlConnection(@"Data Source=.;Integrated Security=SSPI;Initial Catalog=TestDemo;");
if(conn.State!=ConnectionState.Open)
conn.Open();
return conn;
}
データの挿入に使用できないデータベースのタイプは何ですか? – Jake1164
保護しようとしているシナリオは非常に不明です。おそらくあなたがしようとしていることを言い換えることはできますか? –
@MarcGravell実際には私たちの電子商取引のウェブサイトの商品スパイク活動をデザインしていました。例えば、asp.netはマルチスレッドなので、商品は20個しか買えません。 :( – JeffZhnn