我想了解如何安全地增加計數器列,這可能會被許多用戶(它是一個移動應用程序的Web API)同時增加。使用簡單更新計數器列的原子增量
我讀過流行的問題在SO處理這一問題的策略,但我似乎無法弄清楚什麼是錯用一個簡單的:
UPDATE Table SET Counter = Counter + 1
我已經建立了下面的代碼示例嘗試並獲得一致的價值觀和證明自己,只用這個簡單的更新語句是不是好的做法:
class Program
{
static void Main(string[] args)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 100; i++)
{
Task t = Task.Factory.StartNew(() =>
{
WriteToCounter();
});
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
}
static void WriteToCounter()
{
string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(connString))
{
connection.Open();
Random rnd = new Random();
for (int i = 1; i <= 100; i++)
{
int wait = rnd.Next(1, 3);
Thread.Sleep(wait);
string sql = "UPDATE Table SET Counter = Counter + 1";
SqlCommand command = new SqlCommand(sql, connection);
command.ExecuteNonQuery();
}
}
}
}
在樣品我試圖模擬許多用戶同時訪問API和更新計數器的場景。代碼運行時,計數器爲始終爲10000,這意味着它是一致的。
測試是否正確模擬我描述的場景?
如果是這樣,我怎麼能使用更新語句沒有任何特殊的鎖定/交易策略,仍然得到一致的結果?
不知道爲什麼它被投下。 – gdoron