- PR -

SQLServer2005について

投稿者投稿内容
aka
会議室デビュー日: 2008/05/28
投稿数: 1
投稿日時: 2008-05-28 13:26
はじめまして。
SQLServer2005に関して質問あります。
読み取り操作でのロックをなくすため、
READ_COMMITTED_SNAPSHOTをONにしようと思い、
以下URLを参考にしたのですが
http://msdn.microsoft.com/ja-jp/library/ms175095.aspx

対象DBに接続が存在するときには

ALTER DATABASE DB名
SET READ_COMMITTED_SNAPSHOT ON;

コマンドを流すことができません。

どうしても、対象DBに接続が存在するときに(DBを停止できないため)、
READ_COMMITTED_SNAPSHOTをONにする必要があります。

上記コマンドをアナライザで、実行する以外で、
READ_COMMITTED_SNAPSHOTをONにする方法はあるのでしょうか?

知識不足で申し訳ありません。
宜しくお願い致します。





[ メッセージ編集済み 編集者: ud 編集日時 2008-05-28 13:29 ]
ふりっつ
会議室デビュー日: 2007/11/18
投稿数: 15
投稿日時: 2008-06-10 01:36
akaさんが提示されているURLに以下の記述があります。

引用:

READ_COMMITTED_SNAPSHOT オプションを設定すると、そのデータベースでは ALTER DATABASE コマンドを実行する接続のみが許可されます。ALTER DATABASE が完了するまで、そのデータベースには他に開かれた接続が存在しないようにする必要があります。データベースをシングル ユーザー モードにする必要はありません。



ということなので、やろうとしていることは出来ないものと思います。
ひろ
会議室デビュー日: 2008/06/10
投稿数: 2
投稿日時: 2008-06-10 04:45
よこやりを入れて申し訳ないのですが、私も近々、READ_COMMITTED_SNAPSHOT オプションを利用する予定なので質問させてください。

引用:
--------------------------------------------------------------------------------
READ_COMMITTED_SNAPSHOT オプションを設定すると、そのデータベースでは ALTER DATABASE コマンドを実行する接続のみが許可されます。ALTER DATABASE が完了するまで、そのデータベースには他に開かれた接続が存在しないようにする必要があります。データベースをシングル ユーザー モードにする必要はありません。
--------------------------------------------------------------------------------
データベースに接続しているユーザがゼロであることが保障されない限り、READ_COMMITTED_SNAPSHOT オプションは利用できないということですよね。
現実的にそのようなデータベース環境はごく希だと思うのですが・・・
もしそうなら、私の環境では使えませんねぇ・・・
オラクルでもこのような制限がありましたっけ?
ふりっつ
会議室デビュー日: 2007/11/18
投稿数: 15
投稿日時: 2008-06-10 20:03
Oracleは、あまり詳しくないので誤っているかもしれません。
Oracleの分離レベルの設定は、トランザクション単位で行うことになっていたと思います。
そのため、データベースの接続が何もない状態(変更するユーザのみ接続している状態)である必要はなかったはずです。
分離レベルを変更する場合には、トランザクションの最初で分離レベルを指定すれば良かったかと・・・

SQL Serverでは、トランザクションの分離レベルの設定をデータベース単位で指定することになるため、このような状況が発生するのだと思います。
ひろ
会議室デビュー日: 2008/06/10
投稿数: 2
投稿日時: 2008-06-11 03:29
引用:

ふりっつさんの書き込み (2008-06-10 20:03) より:
Oracleは、あまり詳しくないので誤っているかもしれません。
Oracleの分離レベルの設定は、トランザクション単位で行うことになっていたと思います。
そのため、データベースの接続が何もない状態(変更するユーザのみ接続している状態)である必要はなかったはずです。
分離レベルを変更する場合には、トランザクションの最初で分離レベルを指定すれば良かったかと・・・

SQL Serverでは、トランザクションの分離レベルの設定をデータベース単位で指定することになるため、このような状況が発生するのだと思います。



これじゃあ、機能を使いたくても使えないですよね。
どのような運用を想定しているのでしょうかね。
やっぱりOracleを使うほうがいいのかな…
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-06-11 14:12
引用:

SQL Serverでは、トランザクションの分離レベルの設定をデータベース単位で指定することになるため


いえいえ、そんなことはありませんよ。SQL Server でも分離レベルはトランザクション単位で指定します。

ここで話に出ている SET READ_COMMITTED_SNAPSHOT ON というのは SQL Server が読み取り一貫性をどうやって実現するかを切り替えるためのものです。

SQL Server 2000 (8.0) までは、読み取り一貫性を共有ロックによって実現していましたが、SQL Server 2005 (9.0) からは、Oracle と同じように共有ロックを使用しないバージョニング(スナップショット)によって読み取り一貫性を実現することができるようになりました。

下位互換性のために、既定では共有ロックによって読み取り一貫性を実現するようになっているのですが、これをバージョニングによる読み取り一貫性に変更する操作が SET READ_COMMITTED_SNAPSHOT ON です。

これは「READ COMMITTED 分離レベルの振る舞い(実装)を切り替える」のであって、「トランザクション分離レベルを変更する」という操作ではありません。

分離レベルの追加ではなく、従来の READ COMMITTED 分離レベルの機能を 2つから選択できるようにしたのは、既存のアプリケーションに手を加えずにパフォーマンスを向上させることができるようにするためと聞いています。(既存のアプリケーションが READ COMMITTED 分離レベルで動作している場合、サーバー側を 共有ロックからバージョニングに変えるだけでパフォーマンスが向上することが期待できるケースが多くあります。)

トランザクション分離レベルの変更をおこなう場合は、SET TRANSACTION ISOLATION LEVEL を使います。SET READ_COMMITTED_SNAPSHOT ON は読み取り一貫性の実装方法を切り替えるものですので、データベース構築時に一度だけ設定するのが一般的だと思います。
ふりっつ
会議室デビュー日: 2007/11/18
投稿数: 15
投稿日時: 2008-06-11 20:08
未記入さん、フォローありがとうございます。

読み取り一貫性の設定によって、ユーザが目にするデータに違いが発生してしまう恐れもありますので、この辺りも考慮してDBを構築することを想定しているのだと思います。

読み取り一貫性に関する情報として、以下が参考になると思います。
http://www.microsoft.com/japan/sql/facts/compare/03.mspx

引用:
SQL Serverでは、トランザクションの分離レベルの設定をデータベース単位で指定することになるため


これについては、ANSI 標準のトランザクション分離レベルに基づいて考えた場合という意味で書き込ませて頂きました。
前提を記述するのを忘れてしまったため、誤解を与えてしまったようで申し訳ありません。

SQL Serverの分離レベルが、READ COMMITTED 分離レベルとトランザクション分離レベルに分かれていることは知っていましたが、標準の定義上、トランザクション分離レベルの1つでしかないはずなのにデータベースの設定として切り替えるというのが不自然なのかなと思ったので。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-06-11 20:58
引用:

これについては、ANSI 標準のトランザクション分離レベルに基づいて考えた場合という意味で書き込ませて頂きました。前提を記述するのを忘れてしまったため、誤解を与えてしまったようで申し訳ありません。


うーん。ちょっと意味が分かりません。私がまだ誤解しているかもしれませんので、もうちょっと説明していただけると助かります。ロックヒントによるステートメントレベルの分離レベルの話とは関係ないのですよね?

スキルアップ/キャリアアップ(JOB@IT)