より直接的なタイトルのために更新..
コミット直後にトランザクションからコミットされたデータを表示する際に問題が発生しています。
ユーザー入力からデータを受け取り、1対多の関係を持つ複数の子テーブルを持つ親テーブルの形式でDB (SQL Server 2005)にデータを入れています。私はトランザクションを使用しており、完了したらコミットしています。SELECT
データはDB にコミットされますが、グループのすべての行が入力されているかどうかを確認するために、コミット後に DB に対して他のいくつかのクエリ (ステートメントのみ) をすぐに実行します。これらの行はいつでも誰でも入力でき、それぞれが独自のトランザクション内にあります。したがって、「グループ」にデータベースで必要な合計3行があるとします。トランザクションをコミットしてから、DBを読み取って、コミットしたばかりのトランザクションのグループを含め、グループが完了しているかどうかを確認します。
問題は、コミット後にデータを読み取っても、コミットしたばかりのトランザクションが返されないことです...このトランザクションがグループの最後の行である場合、読み取りによって失われ、返されません。
そう...
- 取引開始。
- 行を書きます...
- トランザクションのコミット..
- 完全なグループが存在するかどうかを確認するために読んでください...
- 現在のトランザクションが返されていないグループ。他の完全なグループが返されました。
別のトランザクションを送信すると、このデータが返されることに注意してください...この新しいトランザクションに別のグループを完了する行が含まれている場合、新しい行は返されません...
これが私のコードです..省略されています...
SqlConnection sqlConn = getConn(); //getconn is a function that returns a connection object
String sqlSTR = "<<<MY INSERT STATEMENT>>>";
SqlTransaction trans = sqlConn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted,"Trans");
SqlCommand sqlCMD;
try
{
sqlCMD = new SqlCommand(sqlSTR, sqlConn, trans);
//...Add all my data to the DB.
trans.Commit();
catch (SqlException sqlErr)
{
trans.Rollback("Trans");
throw;
}
finally
{
trans.Dispose();
}
次に、「完了したグループ」を探して DB を読み取るコードがありますが、このデータが属するグループは完了しても返されません。
データは保存されます...データは次の呼び出しで同じコードで取得できます..しかし、ここでは取得できません。
SQLによってトランザクションをコミットするのに時間がかかり、SQL Serverによってコミットされる前に読み取りが呼び出されるようです...コミットされていないデータへの読み取りを許可するようにトランザクションが設定されていても。
他のコードに移る前に、コミットがコミットの完了を待つようにする方法はありますか?
SELECT @@TRANCOUNT
コミット直後に接続に対して試みましたが、常に0を返します。
ありがとう!
編集:
public static SqlConnection getConn()
{
try
{
string sqlStr = WebConfigurationManager.ConnectionStrings["conn_Main"].ConnectionString;
SqlConnection sqlCN = new SqlConnection(sqlStr);
sqlCN.Open();
return sqlCN;
}
catch
{
throw;
}
}
ストアド プロシージャを使用して、トランザクション後にレコードを読み取っています...
SP では、いくつかの結合を行う基本的な select ステートメントを使用していますが、他にあまり多くはありません。最初に提出物を持つ「グループ」のリストを引き戻し、次に各グループが個々のグループを個別に引きます。次のトランザクションがコミットされるまで、トランザクションで挿入されたレコードが表示されないように見えるのは 2 番目の部分です。
トランザクションをコミットした後、レコードがいつ表示されるかを正確に判断できるかどうかを確認するために、今朝さらにテストを行っています。