この質問はPerlDBIに関するものです(私はMySQLで使用しています)。
次のコードが必要です。
{{ ローカル$dbh->{AutoCommit} = 0; ..。 もしも(...) { $ dbh-> rollback; } ..。 }
期待どおりに動作しますか?(ロールバック後に余分なコミットがないことを意味します)$dbh->{AutoCommit}は$dbh->begin_workおよび$dbh->rollbackと互換性がありますか?
はい、できますが、なぜそうしたいのでしょうか。begin_workを呼び出してから、コミットまたはロールバックしてみませんか。AutoCommitがオンの場合でも正常に動作します。
use strict;
use warnings;
use DBI;
use Data::Dumper;
my $h = DBI->connect();
eval {
$h->do(q/drop table mje/);
};
$h->do(q/create table mje (a int)/);
my $s = $h->prepare(q/insert into mje values(?)/);
foreach my $it(1..2) {
{
local $h->{AutoCommit} = 0;
$s->execute($it);
if ($it == 2) {
$h->rollback;
} else {
$h->commit;
}
}
}
my $r = $h->selectall_arrayref(q/select * from mje/);
print Dumper($r);
outputs:
$VAR1 = [
[
1
]
];
しかし、以下は私には良く見えます:
foreach my $it(1..2) {
$h->begin_work;
$s->execute($it);
if ($it == 2) {
$h->rollback;
} else {
$h->commit;
}
}