• ベストアンサー

トランザクションモード

早速ご教示ください。 データベース(TEST_db)のM_SYAIN_CDというテーブルがあるとします。 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO 上記を実行します。 この状態で、M_SYAIN_CDの全行を返すと、『Microsoft odbc sqlserver driver 時間切れになりました』とエラーになり全行返すことができません。 (1)なぜMicrosoft odbc sqlserver driver 時間切れになりました。とな るのか? トランザクションモード中にテーブルは見れないのでしょうか? 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO COMMIT TRANSACTION GO (2)上記実行後、ROLLBACKはできるのでしょうか? ご教示の程宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • LegaC2
  • ベストアンサー率52% (224/428)
回答No.1

(1)条件により異なります。 トランザクション中のプロセス内では、Select文は実行できます。 トランザクション中のプロセスとは別プロセス内では、Select文は実行できません。 もう少し正確に言うと、トランザクションモード中でも、テーブルに変更を加える前、ここでは、”Delete M_SYAIN_CD”を実行する前であれば、別プロセスからでもSelect文は実行できます。 理由は、テーブルを変更途中の情報を利用した場合、Commitされればよいですが、Rollbackされると矛盾が発生することになります。 例えば、Aさんが自分の残高0円の通帳にATMで10万円振り込む処理をしている最中、BさんがAさんの通帳をみたら、10万円あったので引き出しました。しかし、Aさんは振込みの処理をキャンセルしたら、Aさんの手元にもBさんの手元にも10万円ずつ残ってしまいます。 そういったことをなくすために、このような仕組みになっています。 (2)Commitした後に、RollBackはできません。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

内容はNo1さんの説明の通りですが、質問者さんのオペレーションについて補足します。 >なぜMicrosoft odbc sqlserver driver 時間切れになりました。とな るのか 「全行を返す」というオペレーションをすると、BEGIN TRAN/DELETE文を実行したのとは別のセッションができて、それがSELECTしようとするから見られないのです。 (最初のクエリを実行したセッションがテーブルをロックしているので) BEGIN TRAN/DELETE文を実行した画面と同じ画面でSELECT文を発行すれば中身はみられますよ。

関連するQ&A

  • SQLServerへodbc接続トランザクション

    PHP 5.6.3 SQLServer 2014 IIS 8.5 Web上からPHPへPOSTし、SQLServerへODBC関数(http://php.net/manual/ja/ref.uodbc.php)を使用して接続しています。 その際「odbc_autocommit」を使用しトランザクションをかけているのですが、 同時にDBへ登録(Insert、Delete)をしたときに競合してしまいました。 そもそも「odbc_autocommit」の挙動として、 (1)A端末からDBへ接続 (2)A端末から「odbc_autocommit」を使用しトランザクション (3)B端末からDBへ接続 (4)B端末から「odbc_autocommit」を使用しトランザクション (5)A端末からTEST_TABLEへInsert (6)B端末からTEST_TABLEへInsert 上記手順の(4)の動作の際に、A端末の操作が終わるまでBは待たされるorエラーでかえると想定していたのですが・・・ ----------------------------------------------------------- $serverCon = odbc_connect($serverName,$userName,$password); if($serverCon === false){ $strMsg = ERRMSG_DBCONNECT; writeLog($strMsg, DEBUG_LOG); jumpSystemErrPage(); exit(); } $boCon = true; // 自動コミットをさせないようにする $a = odbc_autocommit($serverCon,false); if($a === false){ $strMsg = ERRMSG_DBCONNECT; writeLog($strMsg, DEBUG_LOG); $aaaa = odbc_errormsg($serverCon); writeLog($aaaa, DEBUG_LOG); jumpSystemErrPage(); exit(); } ----------------------------------------------------------- 確認方法として A端末にてデバッグ状態から上記ソース上の if($a === false){ の行でブレイクしてる最中に B端末から普通に実行した際に $aがfalseのルートに通らずそのまま次の処理へ行ってしまいました。 PHPのODBC接続で更新中にトランザクション(ロック)をかけるのはできないのでしょうか? それとも自分のやり方が間違っているのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 分散トランザクションを開始できなかった

    [OSのVER]:2003server 同士 [SQLServerのVER]:SQLServer2000 StandardEdition SP3 はじめまして! 前のログ(http://www7.big.or.jp/~pinball/discus/sqls/26278.html)で でていたエラーメッセージ サーバー : メッセージ 7391、レベル 16、状態 1、プロシージャ [Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。 [OLE/DB provider returned message: 指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。] OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。 と表示されます ビューや、MSDTC(http://support.microsoft.com/?scid=kb;ja;329332&spid=2852&sid=global) などすべてやってみましたがだめでした Enterprise Managerでリンクサーバーを設定して中身を確認する事もできました ビューでその別サーバーのDBを覗くこともできます ストアドでカーソルを使用しています DECLARE M_USER_CSR CURSOR FOR SELECT INPDATE FROM [別サーバ名].DB.dbo.xxxxxx WHERE INPDATE = @COMP_DATE -- システム更新日付比較 と、定義して FETCH NEXT FROM M_USER_CSR としたところで、エラーが表示されます 最初のフェッチではエラーがでず(一件目は正常に内容を取得してます) 二件目のフェッチでエラーがでます どのような解決方法がございますか? どうか教えてください よろしくお願いします ps:サーバー同士はドメイン管理されていません    ワークグループ管理のもと互いに信頼関係は結んでおります

  • SQLServer2000でログインできません

    Windows2000SP4、IISの環境です。 1.SQLServer2000の認証:Windows認証を使用 2.ODBC接続時、 1)接続するサーバ名:Local 2)SQL ServerがログインIDの権限の確認を行う方法は    :ネットワークへのログインIDでWindows NTの認証メカニズムを使う 3.ASPファイルで以下のように記述しています。 Set Conn = Server.CreateObject(\"ADODB.Connection\") Conn.Open \"DSN=*****ODBCで登録した名前\" 4.エラーメッセージ: Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D) [Microsoft][ODBC SQL Server Driver][SQL Server]ユーザー \'*****(私のサーバ名)\' はログインできませんでした。 index.asp, line 22 5.その他 SQLクエリアナライザでは何も問題なく接続できます。 以上、説明が不十分かもしれません。 なぜログインできないか、ご存知の方教えてください。よろしくお願いします。

  • VB5 + SQLServer2005 で長時間の処理

    今までVB5 OS:windowNT4.0 DB:SQLServer6.5 上で稼働していたシステムをサーバ入替があり OS:Windows2003 Server R2 DB:SQLServer2005 Standard Edition に入れ替えたところ データを読み込んで更新するような処理を1時間ぐらい実行していると Microsoft OLE DB Provider for ODBC Drivers でエラーが発生しました。 [Microsoft][ODBC SQL Server Driver][Named Pipes]ConnectionRead (WrapperRead()). というエラーが発生します。 この現象を回避するにはどうしたらよろしいでしょうか?

  • 価格comで以下のメッセージが出てフリーズします

    出たり出なかったりですが、最近頻繁に出ます。 何か設定変更で直るのでしょうか。 Microsoft OLE DB Provider for ODBC Drivers エラー \'80040e31\' [Microsoft][ODBC SQL Server Driver]時間切れになりました。 /bbs/Main.asp, 行 420

  • 使いこなす基本的なこと

    SQLServer2005を使用していく予定です。 ほぼ初心者に近いです。 普通に作業するための基本的なことが知りたいです。 どこか良いHPなど合わせて教えてもらえると助かります。 宜しくお願いします。 【知りたいこと】 ・少量のテストデータをExcelから簡単にINSERTする方法(一般的にみんながやっている方法) ・大量のテストデータを簡単にINSERTする方法 ・データを手で修正する方法→クエリアナライザで操作するのが一般的? ・一般的にデータ参照はクエリアナライザを使用しますか?他に良いツールはありますか? など

  • DISTINCTの使い方を教えて下さい

    Select 文で DISTINCT を記述すると結果(Count)は-1となってしまいます。 DISTINCTを外すと全件表示されます。 これは何がまずいのでしょうか ? 環境 DB=SQLserver 2000 + IIS 5.0 + ASP 例:Select DISTINCT TABLE1,TABLE2,TABLE3 FROM TABLE ちなみにdbをAccess で使用している時とクエリアナライザではOKでした。

  • ASP 0x80004005 クライアントとの確立で失敗

    いつもお世話になっています。 つい昨日まで、対SQLserverにDB取得が出来ていたのですが、今日になって下記のエラーが発生してしまいました。 IISは匿名アクセスにはチェックが入っている状態です。 なぜこのような現象になるか全く掴めなくて困っております。 ----------------------------------------- エラー タイプ Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC SQL Server Driver]クライアントの接続が確立できません ----------------------------------------- どなたか、ご教授をお願いいたします。 設定の確認事項は補足を入れていただければ、早急にお答えいたします。

  • ODBC接続で新しいレコードを追加できない

    OS XP SP3、ACCESS2003 DBはSQLserver2005express です SQL Server Management Studio Express を使って 新しいDB、テーブル、項目は作成できました。 また同じツールを使って手入力でデータを追記することもできます 質問はこのテーブルを ACCESSからODBC接続して 追加クエリーを実行したいのですが リンクしてテーブルを開いた時点で新規レコードが追加できない状態です。 サーバーの更新をしたく、少ないデータであれば手入力でも 大量のデータでは…ACCESSのクエリーを使いたいと思っております。 ODBC接続の設定が読み取り専用になっているのか そうであれば その設定はどこにあるのか 教えてもらえないでしょうか? 宜しくお願いいたします

  • ORACLEのようにトレースがとれるでしょうか?

    ADO+ODBC接続でSQLサーバーからデータを抽出・更新するのですが、 ORACLEのように実行時のSQLのトレースは取れるでしょうか? SQL文の実行計画はクエリアナライザでわかるのですが… なぜトレースを取りたいかというと、以前ACCESS2000 + ORACLE + ODBC + DAO3.6で、 開発していたときに、コーディングで作成したSQLをODBCあるいはJETが SQLを勝手に書き換えて実行していたのでインデックスが効かないということがありました。 今回はADOを使用するのですが、勝手にSQL文を書き換えて、 インデックスが効かないという事象が発生しないか心配しております。 みなさんよろしくおねがいします。(つたない文章ですみません。m(_ _)m) 開発環境 ************************************************ OS:Windows2003 server Standard Edition SQLサーバー: SQLSERVER2000 クライアント VB.NET クライアントとサーバーの接続 Microsoft ActiveX Data Objects 27. Library ODBC接続 ************************************************