質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

5613閲覧

ROLLBACKをすべきか否かの境がわかりません。(一つのレコードに対するインサート文でROLLBACKは不要だと思ってますがどうなんでしょうか?)

qaz3330

総合スコア113

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/06/28 15:12

SQL文を実行する際に、例外が発生した時、
ROLLBACKを使うことがあるかと思います。

ROLLBACKの必要性は理解できるのですが、
どういうパターンでROLLBACKをして、どういうパターンなら不要なのかというのが未だに理解しきれておりません。

たとえば、複数のINSERT文を実行するときは、1つ目が成功し、2つ目で例外が起こった場合、
データの不整合が起こりうるため、ROLLBACKをすべきかと思います。

ただ、以下のように、一つだけのSQL文を実行したときに、わざわざROLLBACKすべきなのかどうかというのがよくわかりません。

INSERT INTO categories (name) VALUES ("日記")

こちらはあくまで、例なので、簡易なものにしましたが、どこを境にROLLBACKをすべきか否かを判断できるのかなというのがわからない点です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

下記は自分がかつて勉強した際に記載されていた例です。

銀行間での振り込みシステムを想像してください。

A銀行からB銀行に振り込みます。

BEGIN TRY -- 例外確認開始 BEGIN TRANSACTION -- トランザクション開始 -- B銀行口座で振込額を加算(借方に加算) INSERT INTO B_ACCOUNT.RECORD (debit, ...) VALUES ( 5000, ...); -- A銀行口座で振込額を減算(貸方に加算) INSERT INTO A_ACCOUNT.RECORD (credit, ...) VALUES ( 5000, ...); COMMIT TRANSACTION -- トランザクションコミット END TRY BEGIN CATCH -- 例外発生時処理 ROLLBACK TRANSACTION -- ロールバック END CATCH -- なんちゃってSQLです(このままでは動作しません)

B銀行への加算が成功しても、
A銀行での減算が失敗する(ネットワークエラーなど?)とロールバックされます。

質問者様の例の様に1処理だけで成功/失敗が判断出来て完結する場合は、
ロールバックは不要だと思います。

投稿2016/06/28 16:30

Aeona

総合スコア396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自動コミットの場合はロールバックできませんよね。
そこをあえて2フェーズコミットにする(ロールバック
できるようにする)ってことは、失敗に備える必要が
あってそうしてるってことですよね。

Oracleを除けばだいたい自動コミットだったと思うので、
qaz3330さんの考えている通りでいいんじゃないかなあ。

投稿2016/06/28 17:22

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問