Php 使用“选择”在提交前检查事务中的条件

Php 使用“选择”在提交前检查事务中的条件,php,sql,postgresql,transactions,dbal,Php,Sql,Postgresql,Transactions,Dbal,在一个相当大的事务中,如果发生异常,必须执行roolback以避免数据库中的不一致性,我将执行两个操作,包括选择、更新和插入 在下面的简化示例中,我希望在保留“第一次操作”部分的同时,取消“第二次操作”部分中某些条件的插入 我的问题是DBAL和PostGreSQL都不支持嵌套事务,因此我无法单独部分回滚“第二个操作” 我想知道如何处理这个问题。 我曾想在遇到$condition时删除插入,但这听起来像是一个讨厌的解决方案 我如何以更干净的方式处理这个问题 我认为您可以使用保存点做任何事情:。我

在一个相当大的事务中,如果发生异常,必须执行roolback以避免数据库中的不一致性,我将执行两个操作,包括选择、更新和插入

在下面的简化示例中,我希望在保留“第一次操作”部分的同时,取消“第二次操作”部分中某些条件的插入

我的问题是DBAL和PostGreSQL都不支持嵌套事务,因此我无法单独部分回滚“第二个操作”

我想知道如何处理这个问题。 我曾想在遇到$condition时删除插入,但这听起来像是一个讨厌的解决方案

我如何以更干净的方式处理这个问题



我认为您可以使用保存点做任何事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的
SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。我想你可以用保存点做你想做的事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的
SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。我想你可以用保存点做你想做的事情:。我不认为我可以将保存点与DBAL一起使用。无论如何,我过于简化了我的示例,在实际的系统中,在第二次操作之后,我还有其他操作要做。所以我不能直接回滚到保存点。那太容易了…:-)@Nitseg:DBAL可能不包括对保存点的支持,但希望它不会阻止您发出自己的
SAVEPOINT
命令。回滚到保存点不会结束事务,因此您可以在之后开始第三个操作。@尼克:好的,谢谢您的建议。我将使用DBAL来尝试这一点。也许这是可能的。@Craig:这可能是一个选项,但我需要做一些相对复杂的处理,出于一致性的原因,我更喜欢在应用程序端进行处理。
$conn->beginTransaction();

try{

    // ==========================
    // Do a first operation in DB
    // ==========================
    $conn->beginTransaction();
    try{

      // Do an INSERT in DB

      $conn->commit();

    } 
    catch(Exception $e) 
    {
      $conn->rollBack();
      throw $e;
    }

    // ===========================
    // Do a second operation in DB
    // ===========================
    $conn->beginTransation();
    try{

      // Do multiple INSERTs in DB
      while( !$exit )
      {
          // Do one INSERT

          // Go to next occurrence OR exit    
      }

      if( $condition )
      {
          // Here I would like to cancel all the DB INSERTS. 
          // To ease the operation I would like to use the rollBack function.
          // But DBAL is not designed like this. Calling rollback here will  rollback 
          // the outer try also and hence all DB operations inluding the first operation.
          // In addition, PostGreSQL doesn't seem to support nested transactions.
          $conn->rollBack();
      }
      else
      {
          $conn->commit();
      }

    }
    catch(Exception $e) 
    {
      $conn->rollBack();
      throw $e;
    }

    $conn->commit();

} 
catch(Exception $e) 
{
  $conn->rollBack();
  throw $e;
}