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

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

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

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

MySQL

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

トランザクション

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

Q&A

解決済

2回答

2665閲覧

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

mitsu326

総合スコア23

Perl

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

MySQL

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

トランザクション

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

0グッド

1クリップ

投稿2017/09/27 03:18

編集2017/09/27 03:40

現在、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処理が取り消されません。
使い方が間違っているのでしょうか?
また、良い方法が御座いましたら教えてください。

宜しくお願いします。

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

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

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

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

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

mtdsnsk

2017/09/27 03:29

コードはマークダウンを使って記載してください。非常に見づらいです・・・```ここに言語を入力 コード ```
mitsu326

2017/09/27 03:32

ありがとう御座います。大変見づらくなってしまいすみませんでした。修正してみます。
yambejp

2017/09/27 04:17

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

2017/09/27 04:32

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

2017/09/27 04:45

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

回答2

0

自己解決

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

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

解決策は・・・

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

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

投稿2017/09/27 04:52

mitsu326

総合スコア23

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

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

0

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

投稿2017/09/27 03:49

mtdsnsk

総合スコア789

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

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

mitsu326

2017/09/27 03:51

なるほど! それもそうですね(汗 接続の処理はまとめてやるように変更致します。 ありがとう御座います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問