-1

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

//我的保存过程
try
{
dbConn.Open();
dbTran = dbConn.BeginTransaction(IsolationLevel.ReadUncommitted);
//1) 保存 OrderLine
//2) 保存 OrderSerial
//3) 保存 OrderHd
dbTran.Commit();
}
异常
{
dbTran.Rollback();
}
最后
{
dbConn.Close();
}

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

4

4 回答 4

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();
        }
于 2009-12-13T14:16:53.343 回答
0

不确定您的问题到底是什么,但您是否考虑过使用快照隔离级别

于 2009-12-13T13:47:33.637 回答
0

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

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

于 2009-12-13T13:49:45.973 回答
-1

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

于 2009-12-13T13:19:21.717 回答