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

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

ただいまの
回答率

90.99%

  • MySQL

    5115questions

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

  • Perl

    416questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • トランザクション

    19questions

    トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Mysqlを使いトランザクション処理について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 295

mitsu326

score 15

現在、PerlよりMySQLを操作しております。

処理の中でエラー発生時にロールバックする処理を導入したいのですが、うまくロールバックしてくれません。
複数のデータベースへそれぞれ処理を行いいずれかでエラーが発生した場合にロールバック処理と考えております。

データベース1及び2へそれぞれ別のレコードをINSERT処理を行います。
1)データベース1へ接続を行いINSERT処理
2)データベース2へ接続を行いINSERT処理
3)データベース2へのINSERT処理失敗でロールバック処理

・流れは簡略してありますが、一連の流れ的に書きました。

mysql 5.7.19 を使用しております。

my $tbl_name1 = 'tbl_name1';
my $tbl_name2 = 'tbl_name2'; 

my %attr  = (RaiseError=>1, PrintError=>0, mysql_enable_utf8=>1, AutoCommit=>0);
my ( $dsh_connect1, $dsh_connect2 ); 


# 1) DB1 へ接続
eval{
 my $dsn = "DBI:mysql:$dbname1:$dbhost1:$dbport1";
 $dsh_connect1 = DBI -> connect ( $dsn, $dbuser1, $dbpass1, \%attr );
}; 
if(!@){ 
 # 接続1 エラー
}

eval{
    # INSERT処理1
 $sth = $dsh_connect1->prepare("INSERT INTO $dbname1.$tbl_name1 VALUES ($tbl_query_value1)");
 $sth->execute;
 };
if($@){ 
 # INSERT1 Error
} 


# 2) DB2 へ接続
eval{
 my $dsn = "DBI:mysql:$dbname2:$dbhost2:$dbport2";
 $dsh_connect2 = DBI -> connect ( $dsn, $dbuser2, $dbpass2, \%attr );
}; 
if(!@){ 
 # 接続2 エラー
 $dsh_connect1->rollback;
} 


eval{
 # INSERT処理2
 $sth = $dsh_connect2->prepare("INSERT INTO $dbname2.$tbl_name2 VALUES ($tbl_query_value2)");
 $sth->execute;
};
if($@){ 
 # INSERT2 Error
 $dsh_connect1->rollback;
}else{
 $dsh_connect1->commit;
 $dsh_connect2->commit;
}


$dsh_connect1->disconnect;
$dsh_connect2->disconnect;


exit;

 

上記を実行するとデータベース1に対してのINSERT処理が取り消されません。
使い方が間違っているのでしょうか?
また、良い方法が御座いましたら教えてください。

宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yambejp

    2017/09/27 13:17

    当該テーブルのDBエンジンはinnoDBでしょうか?

    キャンセル

  • mitsu326

    2017/09/27 13:32

    確認したところ、MyISAM になっておりました。

    キャンセル

  • mitsu326

    2017/09/27 13:45

    ありがとう御座います! MyISAM ではサポートしていないんですね。innoDB に変更したところできました。ありがとう御座いました。

    キャンセル

回答 2

check解決した方法

0

mtdsnskさん、yambejpさん・・・
ご質問にお付き合い頂きましてありがとう御座います。

mtdsnskさんには、流れのご指導を頂きましてありがとう御座います。
yambejpさんには、DBエンジンによりサポートの有無がある事に気が付かせて頂きました。

解決策は・・・

MyISAM では、ロールバック処理がサポートしていないため、
innoDB へ変更する事により動作の確認が取れました。

Mysqlをもっと勉強していきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

とりあえず、2つのDBへの接続は先頭で一気にやったほうがよくないですか?
一連の手続きで両方とものDBに接続が成功しない限りSQL自体を発行しない作りにしたほうがいいです・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 12:51

    なるほど!
    それもそうですね(汗

    接続の処理はまとめてやるように変更致します。

    ありがとう御座います。

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5115questions

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

  • Perl

    416questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • トランザクション

    19questions

    トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。