現在、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処理が取り消されません。
使い方が間違っているのでしょうか?
また、良い方法が御座いましたら教えてください。
宜しくお願いします。
回答2件
あなたの回答
tips
プレビュー