• ベストアンサー

トランザクション使用

DBファサードによるDB操作で、トランザクションを使用するのは、 INSERT/UPDATE/DELETE文の場合のみで、 SELECT文は使用しないでいいのでしょうか?

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5068/13243)
回答No.1

トランザクションを利用する目的は、複数レコード、複数テーブルのデータを同時変更する際に全ての変更が正常に行えなかった場合にデータを元に戻せるようにする事でデータの不整合を防ぐことです。 SELECTは処理を実行した時点でのデータを参照しているだけで、元に戻すという処理は必要ありませんからトランザクションを使用する理由がありません。

isi999
質問者

お礼

ありがとうございます

関連するQ&A

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

    トランザクションの考え方を教えて下さい。 「データの参照や追加・更新・削除といった処理に矛盾がないことを保証する」という記述を見たのですが、下記の場合も良いのでしょうか。 トランザクションの開始 SELECT * FROM Aテーブル WHERE 項目A = '1' --処理-- UPDATE Aテーブル SET 項目B = '2' WHERE 項目A = '1' トランザクションの終了 開始から終了までの間に他のPCによって SELECT対象のデータが増える可能性があります。 この場合UPDATEするときはやはりSELECTの結果でLOOPするべきなのでしょうか。 上記のようにするとSELECT件数とUPDATE件数は異なってしまうのでしょうか。 環境はVB2005+SQL Server です。

  • トランザクション中にSELECTした場合について

    InnoDBを使っているのですが、 以下の1.から5.の処理の間に、サーバー1.の「テーブルA」へ SELECTを掛けた場合、何か遅い気がします・・原因は何でしょうか? 1.サーバー1でトランザクション開始 2.サーバー1の「テーブルA」をDELETEでを全削除 3.サーバー2から「テーブルA」の新しいデータを取得 4.3.で取得したデータをサーバー1の「テーブルA」へINSERT 5.サーバー1でトランザクション終了 他のトランザクションでDELETEされたレコードに対し、 SELECTすると結果が返るのは遅いでしょうか?

    • ベストアンサー
    • MySQL
  • SELECT FOR UPDATE にトランザクションは必要ですか?

    SELECT FOR UPDATE を使う時に、 SELECTの前でトランザクションを開始する必要はあるでしょうか? それとも、ただ、 SELECT FOR UPDATE UPDATE でも、行ロックされるでしょうか? そもそもトランザクションとは、 複数の更新がない場合は使う必要はないのでしょうか?

    • ベストアンサー
    • MySQL
  • トランザクションの考え方の疑問点

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

  • SELECT FOR UPDATE について

    ■SELECT FOR UPDATEとは、 複数のプログラムで在庫の更新などが行われる場合に、 使用するべきでしょうか? ■SELECT FOR UPDATEのロック期間は、他の更新が待たされるのは 下記2.~3.の間でしょうか? バッチ更新(5分) 1.トランザクション開始 2.SELECT FOR UPDATE 3.UPDATE 4.トランザクション終了 ■上記2.のSELECT FOR UPDATEがおこなれた時点のレコードに対し、  他の場所でSELECT FOR UPDATEした場合、  上記2.の時点のデータがSELECTされるのでしょうか?  それとも、上記3.が終わるまでSELECTを待つのでしょうか? DBは、MySQL5ですが、DB問わず同じ挙動と思い、 このカテゴリに質問されていただきました。

  • SQL Serverトリガの中でDMLの種類判断

    SQL Serverのトリガの中で、DMLの種類(INSERT/UPDATE/DELETE)を取る方法ってありますか? こんにちは。アべです。 下記のようなトリガを作成して、操作(INSERT/UPDATE/DELETE)の履歴を 残したいのですが、トリガを3本に分けるのもあれなので、 操作の種類(INSERT/UPDATE/DELETE)を履歴用のテーブルに入れたいのですが、 書き方がわかりません。 取得方法のやり方を教えてもらえないでしょか? CREATE TRIGGER [mst].[TriggerUserActionHistory] ON [mst].[User] AFTER INSERT, UPDATE, DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; --ACTION TYPE未設定 ↓今はINSERT固定しかできない。 insert into [history].[User] select 'INSERT',getdate(),* from inserted; END GO

  • Accessdでの「トランザクションが多すぎる」エラーとは何?

    Access98のVBAでプログラムを組み、RecordsetをUpdateしたり、Deleteしたりしていると、『実行時エラー'3003':ネストしているトランザクションが多すぎるため、トランザクションを開始できませんでした』とエラーが発生します。 「トランザクション」の意味が分かりませんが、プログラムの中では、「トランザクション」なるモノを定義や設定したりしておりません。 ヘルプを閲覧すると「BeginTrans」「CommitTrans」「Rollback」と云う難しそうな言葉が出てきました。 エラーが発生しないようにするためには、プログラムの中にどの様なエラー回避の語を書き込んで置けば良いのでしょうか?

  • 一つのトランザクションでSELECTとUPDATEできますか? (ADO.NET)

    いつもお世話になっております。 ADO.NETの話なのですが、トランザクションを開始したコネクションオブジェクトで DataAdapterを使ったSELECTと、ExecuteNonQueryを使ったUPDATEを交互に繰り返し 行うことはできるでしょうか? 現状できていないので可能なのであれば共通関数の見直しが必要かと思っています。 いまはSELECTとUPDATEを別のコネクションで行っているのですが、UPDATE後に 同じテーブルの該当レコードをSELECTにいくため、デッドロックが発生しています。

  • トランザクションの開始

    VBでSQLSERVER6.5にODBC接続し、 トランザクションを開始しようとしたところ、 以下のエラーメッセージが表示されました。 どういうことか教えてください。 db.BeginTrans 実行時エラー '2147168227(8004d01d('; 1つ以上のODBC接続が使用中のため、トランザクションを開始できません。

  • SELECT文でのデッドロックに対しての対処方

    先日よりデッドロックが発生するようになり、確認の為にトレースログを 抽出するように設定かけたのですが、UPDATE文とSELECT文がぶつかり デッドロックが発生している事がわかりました。 しかし、UPDATE文にはトランザクションをかけていますが SELECT文には特にロックかけていない為、どうして起こっているのか わかっていません。 SELECT文を読んでいる時にUPDATE文によって レコードに変更があった為、デッドロックが発生したのでしょうか? SELECT文にはUNLOCKをつけた方がいいのでしょうか? プログラムはDELPHI DBはSQLSERVER2000になります。 お忙しい所申し訳ありません。 宜しくお願い致します。