Я предполагаю, что вы используете DBD :: ODBC, поэтому имейте это в виду, когда читаете следующее.
По умолчанию DBI будет в режиме AutoCommit, если вы его не отключили.
Не передавайте несколько частей SQL, которые используют транзакции, подобные этой, в SQL Server с помощью метода do, поскольку DBD :: ODBC будет использовать SQLExecDirect для do по умолчанию и действительно не предназначен для работы с несколькими операторами.Вам лучше использовать подготовить / выполнить или разделить ваш SQL и выполнить коммит в Perl следующим образом:
$dbh->{RaiseError} = 1;
$dbh->begin_work;
eval {
$dbh->do(q/insert.../);
$dbh->do(q/update.../);
$dbh->commit;
1;
};
if ($@) {
$dbh->rollback or warn "rollback failed";
}
или поместить вашу вставку / обновление в процедуру SQL Server.