2009-12-13 97 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(); 
     }