【问题标题】:Need Help about ADO.Net Transaction需要有关 ADO.Net 事务的帮助
【发布时间】:2009-12-13 13:16:05
【问题描述】:

我使用 Microsoft SQL Server 2005 sp3 开发 C# 窗口应用程序。
我的应用程序出现问题,而其中一位客户保存订单文档。
另一个客户端无法从订单表中选择数据 util 保存过程已完成。
我使用 Transaction 和 Isolation=ReadUncommit 来保存订单文档。
我的应用程序有 3 个表是 OrderHd、OrderLine 和 OrderSerial。
每 1 个订单文档的 OrderSerial 记录约 1,000-5,000 条记录

//我的保存过程
试试
{
dbConn.Open();
dbTran = dbConn.BeginTransaction(IsolationLevel.ReadUncommitted);
//1) 保存订单行
//2) 保存 OrderSerial
//3) 保存 OrderHd
dbTran.Commit();
}
异常
{
dbTran.Rollback();
}
终于
{
dbConn.Close();
}

我该如何解决这个问题??? _ _"

【问题讨论】:

  • 对不起,我没有正确理解你的问题,尤其是表格部分,你能说得清楚一点吗..,还请发布你如何从数据库中读取的代码,谢谢!

标签: ado.net transactions isolation-level


【解决方案1】:

不确定您的问题到底是什么,但您是否考虑过使用Snapshot isolation level?

【讨论】:

    【解决方案2】:
            //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();
            }
    

    【讨论】:

      【解决方案3】:

      如果您希望将不可预知的结果保存到数据库中,请继续使用 READ UNCOMMITTED 事务级别,否则您最好确保所涉及的表具有适当的索引,并且索引和统计信息都已启动迄今为止。

      缺少或次优的索引是导致数据库过度锁定的最常见(也是被忽视的)原因之一。

      【讨论】:

        【解决方案4】:

        尝试在读取数据的代码上使用 ReadUncommitted 隔离级别,而不是在保存数据的代码中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-28
          • 2021-09-06
          • 1970-01-01
          • 2015-06-23
          • 2014-12-26
          • 2013-08-12
          • 2014-06-11
          • 1970-01-01
          相关资源
          最近更新 更多