Проблема транзакции сервера SQL с использованием Perl DBI - PullRequest
1 голос
/ 24 февраля 2011

У меня есть приведенный ниже блок кода с оператором INSERT и UPDATE внутри блока BEGIN TRAN и END TRAN.

Сейчасмы все знаем, что эта операция атомарная.Но я вижу иначе.вставка завершается неудачно из-за нарушения уникального ограничения, но все же происходит ОБНОВЛЕНИЕ.Когда я выполняю ту же часть на сервере SQL напрямую, я вижу, что операция совершенно атомарна.Есть ли что-нибудь на фронте PERL DBI , которое перекрывает BEGIN TRAN и COMMIT TRAN.Есть указатели?

$dbh->{RaiseError} = 1;
$dbh->{PrintError} = 1;

my $sql = "BEGIN  TRAN

         INSERT INTO $table ...

         UPDATE $table ....

         COMMIT TRAN";
$dbh->do($sql);

1 Ответ

2 голосов
/ 24 февраля 2011

Я предполагаю, что вы используете 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.

...