需要有关ADO.Net Transaction的帮助

时间:2009-12-13 13:16:06

标签: ado.net transactions isolation-level

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

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

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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();
        }