與交易玩的第一次,我想我會得到下面的代碼工作:這個交易範圍爲什麼不起作用?
namespace database
{
class Program
{
static string connString = "Server=ServerName;Database=Demo;Trusted_Connection=True;";
SqlConnection connection = new SqlConnection(connString);
static Random r = new Random();
static void Add()
{
try
{
Thread.Sleep(r.Next(0, 10));
using (var trans = new TransactionScope())
{
using (var conn = new SqlConnection(connString))
{
conn.Open();
var count = (int)new SqlCommand("select balance from bank WITH (UPDLOCK) where owner like '%Jan%'", conn).ExecuteScalar();
Thread.Sleep(r.Next(0, 10));
SqlCommand cmd = new SqlCommand("update bank set balance = " + ++count + "where owner like '%Jan%'", conn);
cmd.ExecuteNonQuery();
}
trans.Complete();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Remove()
{
try
{
Thread.Sleep(r.Next(0, 10));
using (var trans = new TransactionScope())
{
using (var conn = new SqlConnection(connString))
{
conn.Open();
var count = (int)new SqlCommand("select balance from bank WITH (UPDLOCK) where owner like '%Jan%'", conn).ExecuteScalar();
Thread.Sleep(r.Next(0, 10));
SqlCommand cmd = new SqlCommand("update bank set balance = " + --count + "where owner like '%Jan%'", conn);
cmd.ExecuteNonQuery();
}
trans.Complete();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(new ThreadStart(Add));
t.Start();
}
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(new ThreadStart(Remove));
t.Start();
}
Console.ReadLine();
}
}
}
我認爲在年底增加了100和100後,減法我的平衡到達是同我的出發點 - 100,但是每次運行腳本時它都會不斷變化。即使有隔離級別的序列化。有誰能告訴我爲什麼? O_o
編輯:將連接打開和關閉移動到事務處理範圍內。現在 的問題是,我得到
像馬克Gravell說「事務(進程ID XX)已被死鎖的鎖資源與另一個進程,並已被選作死鎖犧牲品重新運行該事務。」: 把事務範圍內的連接,並添加UPDLOCK的選擇查詢與變更的IsolationLevel到REPEATABLEREAD結合的伎倆:)
static void Add()
{
try
{
Thread.Sleep(r.Next(0, 10));
using (var trans = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.RepeatableRead }))
{
using (var conn = new SqlConnection(connString))
{
conn.Open();
var count = (int)new SqlCommand("select balance from bank WITH (UPDLOCK) where owner like '%Jan%'", conn).ExecuteScalar();
Thread.Sleep(r.Next(0, 10));
SqlCommand cmd = new SqlCommand("update bank set balance = " + ++count + "where owner like '%Jan%'", conn);
cmd.ExecuteNonQuery();
}
trans.Complete();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
「但是每次運行腳本時它都會不斷變化」 - 請澄清一下:你在看哪裏,以及你看到的是什麼**。它*最終*相同嗎?問題是你看到的中間值?要麼...? – 2012-07-24 08:54:46
我通過Microsoft SQL Server Management Studio查看我的數據庫。我手動將平衡值設置爲100(int),運行一次程序,然後按F5查看通常類似於92-97的結果 – user1384085 2012-07-24 09:00:08
@ user1385085是在**所有操作之後的**嗎?和:有沒有例外? – 2012-07-24 09:00:50