• 締切済み

分離レベルの設定

情報処理の勉強をしています。 分離レベルは「トランザクション」単位に指定するのでしょうか? 「SQL文」単位で指定するのでしょうか? 情報処理試験等の本を読むと分離レベルの単位はトランザクションとなっています。 ただ一方でDB2にはWITH UR,CS,RR等があり、SQL単位でISOLATIONレベルを設定することが できます。 どのように考えればよいかわかりません。 よろしくお願いします

みんなの回答

回答No.1

はじめまして、通りすがるというものです。ご質問の回答は以下のことでしょうか? << 分離レベルは「トランザクション」単位に指定するのでしょうか? 「SQL文」単位で指定するのでしょうか? >> http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%86%E9%9B%A2%E3%83%AC%E3%83%99%E3%83%AB << どのように考えればよいかわかりません。 >> 考え方は、以下に利用者に負担がなくテーブルに対して整合性保つように考えます。 << 情報処理の勉強をしています。 >> 情報処理用の解というのでは、判断できません。ユーザー要望及びインフラ、予算などにより回答は変わると思います。

関連するQ&A

  • C#でトランザクション開始後参照出来ない

    言語:C# DB:SQLServer2008 1.トランザクション開始 2.テーブルAをUPDATE 3.色々な処理(省略) 4.テーブルAのUPDATE前の情報を参照 5.参照したテーブルをもとにテーブルBをUPDATE 6.すべての処理が正常だったら全テーブルコミット、1つでも失敗したら全テーブルロールバック 問題となっているのは 4.テーブルAのUPDATE前の情報を参照する際に、テーブルAがロックされていて参照出来ないことです。 トランザクション開始時に分離レベルを設定してみましたが同じ結果でした。 tran = con.BeginTransaction(分離レベル); お分かりになる方ご教授お願いします。

  • 排他ロックしたレコードが、別トランザクションから参照されてしまい困っています。

    SQL Server2000を使用し、 あるトランザクションで排他ロック(XLOCK)をかけたレコードが 他のトランザクションから共有ロックを使用し参照できてしまう状態は存在するのでしょうか? 排他ロックをかけたレコードが 他のトランザクションから参照できてしまい困っています。 現在、下記の環境で開発を行っております。 ・サーバ側 Windows Server2003 SQL Server2000(sp4) ・クライアント側 Windows Xp(sp3) jdk6.0 jdbc 3.0 Type4 以下が具体的な状況となります。 前提として、 ・二つのトランザクション(以下A、Bと表記します)が存在する。 ・AとBは別のユーザでコネクションを張っている。 ・autoCommitはfalseに設定している。 ・テーブルにプライマリキーやインデックスは張っていない。 ・レコードは10件。 ・分離レベルはREAD COMMITED (1)Aから、「SELECT * FROM TEST_TABLE WITH(XLOCK) 」を発行 (2)Bから、「SELECT * FROM TEST_TABLE」を発行 このような状況で、(1)、(2)の順で処理を行った場合に 私の認識では、(2)の検索時にタイムアウト等が発生するという認識です。 しかし、(2)のSQLは正常に終了し、(1)と同じデータが取得されてしまいます。 ◆その他、確認したこと ・(1)の処理直後に処理を停止し、Enterprise Managerでロックが取得されているか確認したところ、トランザクションAがすべてのレコードを排他ロック(X)していた。 ・(2)の処理直後にロックの状態を確認しても、やはりトランザクションAが、排他ロック(X)していた。 ・CSEを使いODBC経由で同様の操作を行った場合も同じ動作がおこる。 ・(1)WITH(XLOCK, TABLOCK)とすると(2)でデータが取得できなくなる。 ・(2)のSQLを「SELECT * FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定するとタイムアウトする(期待通りの動き) ・(2)のSQLを「SELECT COLUMN01 FROM TEST_TABLE WHERE COLUMN01 > 0」のように指定すると、今度は、なぜか取得出来てしまう。 ・(1)と(2)の間にトランザクションAでUPDATEなどを行うと(COMMITはしない)(2)のSQLのWHERE句や取得するカラムに関係なく、(2)のSQLはタイムアウトする(当り前か。。。) いろいろ書きましたが、排他ロックされたレコードに 共有ロックはかけれないという認識なのですが、 そうではないのでしょうか? また、そうではない場合どういった場合に、 共有ロックが可能となるのでしょうか? SQL Serverの排他制御に詳しい方や 同じような現象に陥った方がいましたら、ご教授お願いします。

  • DAOの作成単位について

    MVCでWebアプリを作成していると、ほぼ必ずDAOを作成することになると思いますが、DAOの作成単位にいつも悩みます。今までの経験によると大きく二つ「テーブル単位」か「サービス(ビジネスロジック)単位」にDAOを作成している方が多いようですが、それぞれの作成単位によってメリットデメリットがあると思います。この二つ以外にもDAOの作成単位があるかもしれませんが、どちらがよいのか皆さんの意見を聞かせていただきたいです。 1.テーブル単位 【メリット】  ・同じ処理(SQL)が複数DAOに分散しない 【デメリット】  ・複数テーブル情報をまとめてSELECTするような場合、どのテーブルDAOに実装するか迷う。  ・トランザクション処理が必要な一連の処理を記述する場合、テーブル単位では記述できない。 2.サービス(ビジネスロジック)単位 【メリット】  ・トランザクション処理が必要な一連の処理を記述する場合、違和感が無い。 【デメリット】  ・複数のサービスDAOで同じ処理(SQL)が書かれる可能性がある。

  • トランザクションの考え方の疑問点

     トランザクションについてネットでいろいろ調べたのですが、 ピンと来ていないので下記の意味合いで合っているのか、 教えて頂けないでしょうか? ・トランザクションは、データベースに対してかかる (テーブル単位にかかるわけではない) ・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を 走らせた時、そのテーブルがロックされる ・コミットが終わるまではロックはかかったまま ・失敗すればロールバックでデータを元に戻せる  …こんな風に考えていますが、 ここまでは合っているでしょうか? また、下記からが疑問なんですが… ・ロックの種類は、SQLの書き方で決められるみたいですが、 特に指定しなかったらテーブルロックになるものなのでしょうか? ・SELECT中は、ロックがかかるものなのでしょうか?

  • SELECT文でタイムアウトが起こります。

    いつも勉強させて頂いております。どうぞよろしくお願いします。 以下の環境で開発を行っています。 SQLServer2005 ASP.NET C# .NETのソースで 1つのクラスに2つのクエリ(2つともSELECT←複数テーブルを結合している)を呼び出す処理を書いています。(トランザクション処理は付けていません)2クエリとも検索対象テーブルは60万件程度のデータを保持しています。検索条件によって処理速度は違うのですが、1ユーザが最も遅い検索条件で検索をしてもタイムアウトにはなりません。しかし、2ユーザが同じタイミングで検索(どのような条件でも)処理を行うと、タイムアウトを起こしてしまいます。まれにデッドロックも起こります。 SQLServerではSelectのたびにlockがかかるのでSQL文中に「WITH(NOLOCK)」を記述するように書かれているサイトを見つけたのですが、他ユーザからの更新もあり得るテーブルなので、他の方法を探しております。 トランザクション分離レベルは規定値です。 是非、どなたかご教授ください。よろしくお願いします。

  • MySQL 複数のDB接続で上書きされる

    あるphpファイル内の最上段で、 二つのデーターベース接続を行っています。 二つのdsnを使ってそれぞれDBにコネクトしています。 例えばこんな感じです。 //ページ先頭で $mdb2 = db_connect(); //関数内でコネクトされています。 $mdb2_a = db_connect_a(); //関数内でコネクトされています。 で、最初の$mdb2内に格納されているDB接続情報を、 そのphpファイル内で使いまわそうとすると、 後から作られた$mdb2_aに上書きされるようで、$mdb2は使い道がなくなります。 コレを回避する方法としては、 dsnの割り当て情報に、'new_link' => true を追加したり、SQLセーフモードをオンにしたりと、 小細工すれば上手くいくようですが、 これらの方法を使わずにすむ方法はないものでしょうか? 一つのphpファイルで二つのDBに接続しない方法を模索すればいいかもですが、 その手法はないものとして、知恵をお貸しください。 各SQLの発行前にその都度、DB接続を行えばいけるようですが、 分散トランザクションを行い、上記のように二つのDB接続をトランザクション前に取得しようと考えております。 分散トランザクションであっても、その過程内でその都度DB接続しても遅延等で問題が起こらないでものでしょうか? どうもDBの接続ってものすごく処理に負荷がかかる気がして・・・・。 何かいい方法を教えていただきますと助かります。 よろしくお願いします。

  • SQLServerの同時接続

    質問させていただきます。 SQLSerever2000でSELECTの結果を返すだけのストアドプロシージャがあるのですが、複数のユーザーが同時に実行すると、単独で実行した場合に比べて処理速度が低下するという現象が起こっています。 このSELECT(のみ)同士で処理が遅くなることについて原因がわからずに困っています。 今わかっていることは (1)SQL文が非常に複雑(サブクエリの結合も多い)で対象データの件数も多い。 (2)実行時はUPDATEなどの更新処理は一切入っていない(トランザクションも張っていない)。 (3)SELECT時にWITH(NOLOCK)を使用しても結果は変わらない。 (4)分離レベルをUNCOMMITEDにしてみたが結果は変わらない。 (5)プロファイラ上で実行時デッドロックが発生していないことは確認済み (6)ほぼ同時に実行するとやたら遅く、少しタイミングをずらして実行すると、あまり影響し合わない。 (7)処理速度の遅延は同時実行ユーザーのお互いについて発生する(※片方だけが待つわけではなく、ほぼ同時に開始した処理は単独の場合と比べて長い時間をかけて同時に終了する) 以上の事から、ストアドプロシージャの実行処理そのものは並列処理となっているが、SELECT内でのサブクエリ単位の情報取得→結果を返す・・・の処理まわりは並列実行できず、サブクエリごとにお互いを邪魔しあうような状態が発生しているように見えます。 このような想定はそもそも見当違いなのでしょうか? 実際にSELECTのみのSQL同士を複数ユーザーで実行するだけでお互いの処理に影響しあうようなことはあるのでしょうか? また、SELECT時の『共有ロック』について複数ユーザーの同時実行には何の影響もない(更新ロックではないので、ロックの取得は可能)の認識ですが、認識誤りはないでしょうか? DBにはあまり詳しくないのでおかしな事を質問しているかもしれませんが、宜しくお願いいたします。

  • SQLServer、エラーにならずに途中で終了

    VB2008,SQLServer2005でバッチ処理を作成し 下記のような処理を行っているのですが データ件数が多い時、何度行っても エラーにもならず、途中で処理が終わっているようなのですが どのような原因が考えられるのでしょうか・・・ トランザクション開始 DBからデータ取得1 データ編集1 DBへデータ登録1 ループ開始  DBからデータ取得2  データ編集2  DBへデータ登録2 ループ終了 トランザクション終了 上記のDBへデータ登録2の途中で終了してしまっているようです・・・ デバック用としてテキストファイルへの処理工程の書き出し(発行SQLなど)しているのですが 書き出さた文章が文章の途中で終わり、ファイルEOFが・・・ あいうえお と書かれるはずが あいう となってしまっています・・・ なので処理が途中で終わってしまっているのかと思っています。 ディスク容量はかなり余裕があるのでディスク容量不足ではないのですが・・・ よろしくお願いします。

  • トランザクションのネストについて

    トランザクションのネストについて お世話になります。 今、ストアドの中でストアドを実行するようなSQLを作成しているのですが、 このときのトランザクション処理について教えていただきたいです。 簡単な流れとしましては Aトランザクション開始(大枠のストアド) ↓ 処理a  ↓  Bトランザクション開始  ↓  (Aストアドの中のストアド実行)  ↓  Bコミット  ↓ 処理b ↓ Aコミット といった感じなのですが、BストアドでコミットするとBストアドをCALLする前の処理aが コミットされてしまいます。 ここはBはBだけでコミットされてほしいのです。 独自で調べた限りでは、「トランザクションのネストはMySQLではできない」ということらしいのですが、 こういった場合、どのようにしたらよいのでしょうか。 もし方法があれば、ご教示のほどお願い致します。 -環境- [DB MySQL 5.0] [OS Windows XP]

    • ベストアンサー
    • MySQL
  • 平成23年 春期 基本情報技術者 午前 問19

    解説にある、「データベースサーバでは、1トランザクション当たり、データベースの 10 データブロックにアクセスする SQL が実行される。データブロックのアクセスに必要なデータベースサーバの CPU 時間は, 0.2 ミリ秒で、CPU 使用率の上限は、80%であるから、処理できるトランザクションの数は 400 件になる。 」で、なぜ400件になるのかがわかりません。 問題文から、1トランザクションにつき、0.2ミリ秒かかる。 ということは、2秒につき、300トランザクション処理する。 ということは、1秒ではその半分で、150トランザクション処理する。 ということは、150トランザクション×0.8(CPU 使用率の上限)=120トランザクションでは?? http://情報処理試験.jp/FE23a-am/k19.html