C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: C#:SQLServerのIsolationlevelを設定


(過去ログ 89 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■52699 / inTopicNo.1)  C#:SQLServerのIsolationlevelを設定
  
□投稿者/ よし (1回)-(2010/08/20(Fri) 20:23:54)

分類:[C#] 

経験:C#での開発は今回はじめてとなります。

Visual Studio 2008 C#
SQL Server 2005

C#からSQLServerを使用しています。
二つのツール(内ひとつ(B)は別グループが開発のためブラックボックス)
からDBを参照するため、Transactionのロック設定を解除状態にして処理を行ないたいと考えています。
ロックを解除するため、いくつかのサイトを参考に自分が開発しているツール(A)に
下記のようなソースを加えました。

private static void CreateCommand(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
    queryString = "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
}

しかし、ツール(A)でDB操作を行っていると、ツール(B)からDBを参照できず処理が止まってしまいます。
"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"はSQLServerのクエリアナライザで正常に動作するので
SQL文の文法エラーはないです。

C#からトランザクションロック制御を行う方法を教えて頂けますでしょうか。
よろいくお願いいたします。

引用返信 編集キー/
■52700 / inTopicNo.2)  Re[1]: C#:SQLServerのIsolationlevelを設定
□投稿者/ 囚人 (531回)-(2010/08/20(Fri) 21:27:09)
分離レベルなら
SqlTransaction.IsolationLevel
で指定するべきでしょうね。
引用返信 編集キー/
■52712 / inTopicNo.3)  Re[2]: C#:SQLServerのIsolationlevelを設定
□投稿者/ よし (3回)-(2010/08/23(Mon) 10:43:02)
囚人さん

ご回答ありがとうございます。

TransactionVal = mSqlConnection.BeginTransaction(IsolationLevel.ReadUncommitted);

のように、頂いたアドバイスを参考にビギントランザクションの時に分離レベルを設定してみましたが、
ツールAを途中で処理を止めておいて、ツールBを実行するとツールBが処理待ちになってしまいます。
(逆にツールBの処理中にツールAの処理を開始してもロックらしき動作は確認できません。)
分離レベル以外にDBロックに関わる設定が存在するのでしょうか。
恐れいりますが、よろしくお願い致します。
引用返信 編集キー/
■52713 / inTopicNo.4)  Re[3]: C#:SQLServerのIsolationlevelを設定
□投稿者/ 囚人 (532回)-(2010/08/23(Mon) 11:09:50)
大雑把に言えば、分離レベルとは「各種ロックをどこまで引き延ばすか」を指示するものなので、ロックは常に存在しますよ。
どんな SQL を発行しているのかが分からないとアドバイスはしにくいです。

まぁ普通はトランザクションにかかる時間を、他方が処理待ちになっても気にならない時間に短くするべきでしょうね。

もし、トランザクションの間にユーザー操作が入ってしまい、かなりの時間を食うなら設計見直しです。

引用返信 編集キー/
■52715 / inTopicNo.5)  Re[4]: C#:SQLServerのIsolationlevelを設定
□投稿者/ よし (4回)-(2010/08/23(Mon) 11:40:54)
囚人さん

ご回答ありがとうございます。

ツールAから行っていることは、Select文とInsert文の発行です。
しかし、途中でエラーが有った場合、全てロールバックしたいので、
複数レコードを全て処理が終わるまでコミットは行わないようにしています。

<参考>
BeginTransaction(ReadUncommitted)

ループ
Select...
Insert...
Insert...
Insert...
ループ終了

Commit

ツールBは、更新文を発行しているはずです。
調べてて読んだサイトにロックはレコード単位とありましたし、
ツールAとツールBは同じDB内の異なるテーブルを扱うので、
ロックは無関係かと考えておりました。

ロック時間は他のツールで、気になるような時間ではないので、
ツールAの処理を止めてテストを行っています。
ただ、それぞれのツールが異なるテーブルを扱っているので
ロックの影響をなくしたいと考えております。

よろしくお願い致します。

引用返信 編集キー/
■52718 / inTopicNo.6)  Re[5]: C#:SQLServerのIsolationlevelを設定
□投稿者/ 囚人 (533回)-(2010/08/23(Mon) 12:17:43)
>ツールAとツールBは同じDB内の異なるテーブルを扱うので、

じゃあロックは関係ないんじゃないです?
どこで「待ち」になるかきちんと調べました?
引用返信 編集キー/
■52721 / inTopicNo.7)  Re[6]: C#:SQLServerのIsolationlevelを設定
□投稿者/ よし (5回)-(2010/08/23(Mon) 13:50:38)
囚人さん

ご回答ありがとうございます。

失礼いたしました。確認いたしました。
Bツールでは、Bツール開発者からもブラックボックスな、
あるシステムのAPIを使用しており、これがAツールで操作しているテーブルに
アクセスしているそうです。このAPIで待ちとなっております。
ただし、このAPIはAツールで操作しているテーブルへは参照しか行っていないだろう。
という話でした。

参照のみであれば、ReadUncommittedで外部(Bツール)から参照可能だと思っているのですが、
BeginTransactionでの設定方法も問題ないようですし、他(API等)に問題がると考えるほうが
自然でしょうか。

お手数をおかけしますが、よろしくお願い致します。





引用返信 編集キー/
■52842 / inTopicNo.8)  Re[7]: C#:SQLServerのIsolationlevelを設定
□投稿者/ よし (6回)-(2010/08/25(Wed) 18:33:13)
解決いたしました。

上記の例の場合、ツールAではなくツールB側でisolation levelをRead Uncommittedを
指定したら、ロックを回避して干渉しあうことなく処理を完了することが出来ました。
ありがとうございました。
クローズいたします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -