-1

Microsoft SQL Server 2005 sp3 で C# ウィンドウ アプリケーションを開発しています。
クライアントの 1 つが注文ドキュメントを保存しているときに、アプリケーションに問題があります。
別のクライアントが Order テーブルからデータを選択できません。保存プロセスが完了しました。
Order Document を保存するために Transaction と Isolation=ReadUncommit を使用しました。
私のアプリケーションには、OrderHd、OrderLine、OrderSerial の 3 つのテーブルがあります。
オーダードキュメント1件あたりのOrderSerialの記録 約1,000~5,000記録

//My Saving Process
try
{
dbConn.Open();
dbTran = dbConn.BeginTransaction(IsolationLevel.ReadUncommitted);
//1) OrderLine を保存
//2) OrderSerial を保存
//3) OrderHd を保存
dbTran.Commit();
}
例外
{
dbTran.Rollback();
}
最後に
{
dbConn.Close();
}

この問題を解決するにはどうすればよいですか??? _ _"

4

4 に答える 4

0

あなたの質問が正確にはわかりませんが、スナップショット分離レベルの使用を検討しましたか?

于 2009-12-13T13:47:33.637 に答える
0

予測できない結果をデータベースに保存したい場合は、引き続き READ UNCOMMITTED のトランザクション レベルを使用してください。それ以外の場合は、関連するテーブルに適切なインデックスがあり、インデックスと統計が最新であることを確認することをお勧めします。

不足しているインデックスや最適化されていないインデックスは、過度のデータベース ロックの最も一般的な (そして見過ごされている) 原因の 1 つです。

于 2009-12-13T13:49:45.973 に答える
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 に答える
-1

データを保存するコード内ではなく、データを読み取るコードで ReadUncommitted 分離レベルを使用してみてください。

于 2009-12-13T13:19:21.717 に答える