Perl DBI开始与SQL server 2008交互的工作和嵌套事务

Perl DBI开始与SQL server 2008交互的工作和嵌套事务,perl,sql-server-2008,transactions,nested,dbi,Perl,Sql Server 2008,Transactions,Nested,Dbi,我有一个如下的场景。其中main方法需要调用多个方法,1个方法对应1个表,每个方法运行一组必须是原子的语句。因此,它们被封装在一个begin_work、commit、rollback块中 同样,对于表1调用方法,对于表2调用方法,对于表3调用方法,都应该一起成功或失败,这意味着它们必须是原子的。这就是为什么在main方法中也添加了begin_工作、commit、rollback块的原因。但是我可以看到perl不允许我这样做。我收到异常-“DBD::ODBC::db begin\u工作失败:已在事

我有一个如下的场景。其中main方法需要调用多个方法,1个方法对应1个表,每个方法运行一组必须是原子的语句。因此,它们被封装在一个begin_work、commit、rollback块中

同样,对于表1调用方法,对于表2调用方法,对于表3调用方法,都应该一起成功或失败,这意味着它们必须是原子的。这就是为什么在main方法中也添加了begin_工作、commit、rollback块的原因。但是我可以看到perl不允许我这样做。我收到异常-“DBD::ODBC::db begin\u工作失败:已在事务中”。现在我没有任何方法可以修改_table*方法的call _method _,因为它位于库中,并且由于许多原因无法修改它

我可以使用检查点解决此问题吗

  • 保存点是否有帮助()
  • 即使中间有一些提交(在我的示例中通常是这样),回滚到保存点是否仍然有效
  • 即使在同一流程中有并行运行,也可以吗
  • 它会导致数据不一致吗

  • 我认为不修改tableX的调用方法是不可能的


    假设为_table1调用_method _成功,那么提交完成,并且在为_table2调用_method _最终失败后无法回滚。

    如果我通过PERL DBI调用它,Savepoints()会有帮助吗。即使在同一个过程中有并行运行,也可以吗?这会导致数据不一致吗?@TGV:对不起,我不知道SQL Server,但从我在链接上看到的情况来看,似乎保存点只允许回滚事务的一部分,而您希望回滚多个提交的事务,因此它对您的问题似乎没有用。是的,在保存点之后提交某些内容时,似乎没有帮助。
    sub main {
            $dbh->begin_work;
               eval {
                  call_method_for_table1();
                  call_method_for_table2();
                  call_method_for_table3();
                  $dbh->commit;
                  1; 
            };
    
            if ($@) {
                  $dbh->rollback; }
           }
    
        sub call_method_for_table1 {
        $dbh->begin_work;
               eval {
               $dbh->do($INSERTSTATEMENT_TABLE1);
               $dbh->do($UPDATESTATEMENT_TABLE1);
               $dbh->do($DELETESTATEMENT_TABLE1);
               $dbh->commit; 
               };
    
               if ($@) {
                 $dbh->rollback;
               }
        }