2009-12-13 127 views
-1

我使用Microsoft SQL Server 2005 sp3開發C#窗口應用程序。
我的應用程序有一個客戶端保存訂單文檔時的ploblem。
另一個客戶端無法從訂單表中選擇數據util保存過程完成。
我使用事務和隔離= ReadUncommit保存訂單文檔。
我的應用程序有3個表是OrderHd,OrderLine和OrderSerial。每1訂單文檔約1,000-5,000記錄


記錄OrderSerial的//我的保存處理
嘗試
{
dbConn.Open();
dbTran = dbConn.BeginTransaction(IsolationLevel.ReadUncommitted);
// 1)保存訂單行
// 2)保存OrderSerial
// 3)保存OrderHd
dbTran.Commit();
}
異常
{
dbTran.Rollback();
}
finally
{
dbConn.Close();
}
需要關於ADO.Net Transaction的幫助

我該如何解決這個問題? _ _」

+0

對不起,但我沒有正確理解你的問題,特別是表格部分,你能不能更清楚一點..也請發表你如何從數據庫中讀取的代碼,謝謝! – 2009-12-13 13:30:38

回答

0

嘗試使用上讀取數據,而不是將其保存在代碼中的代碼ReadUncommitted隔離級別。

0

如果你想保存到數據庫中不可預知的結果,繼續使用READ UNCOMMITED的交易水平,否則你會更好地確保所涉及的表有合適的索引,以及索引和統計信息是最新的。

缺失或次優索引是過度數據庫鎖定最常見(也是被忽視)的原因之一。

+0

下載者請留下評論。謝謝。 – 2009-12-14 16:41:54

+0

如果您認爲使用「READ UNCOMMITED」是一個好主意,那麼您錯了! – 2009-12-14 16:42:44

0
 //My Simulate Saving Process 
     string mstrConnStr = "Data Source=serverzx; Initial Catalog=Test;User ID=sa;Password=x2y2;"; 
     System.Data.SqlClient.SqlConnection conn = new SqlConnection(mstrConnStr); 
     System.Data.SqlClient.SqlCommand cmd1 = new SqlCommand("Insert Into OrderHd (OrderID , Code,Name) values (@Para0,@Para1,@Para2)",conn); 
     System.Data.SqlClient.SqlCommand cmd2 = new SqlCommand("Insert Into OrderLine (OrderLineID , OrderID,Detail) values (@Para0,@Para1,@Para2)",conn); 

     System.Data.SqlClient.SqlTransaction tr = null; 

     try 
     { 
      conn.Open(); 

      cmd1.Parameters.Clear(); 

      tr = conn.BeginTransaction(IsolationLevel.ReadUncommitted); 

      string strCode = DateTime.Now.ToString("yyyyMMdd : HHmmss"); 
      string strHead = Guid.NewGuid().ToString(); 

      cmd1.Transaction=tr; 
      cmd2.Transaction=tr; 

      cmd1.Parameters.Add("@Para0",strHead); 
      cmd1.Parameters.Add("@Para1",strCode); 
      cmd1.Parameters.Add("@Para2","Name "+strCode); 
      cmd1.ExecuteNonQuery(); 

      for (int i=0;i<5000;i++) 
      { 
       string strItem = Guid.NewGuid().ToString(); 
       cmd2.Parameters.Clear(); 
       cmd2.Parameters.Add("@Para0",strItem); 
       cmd2.Parameters.Add("@Para1",strHead); 
       cmd2.Parameters.Add("@Para2","Detail "+i.ToString()); 
       cmd2.ExecuteNonQuery(); 
       System.Threading.Thread.Sleep(10); 
      } 
      tr.Commit(); 
     } 
     catch (Exception ex) 
     { 
      tr.Rollback(); 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      conn.Close(); 
     }