在提交之前使用SELECT检查事务中的条件

时间:2015-06-19 17:48:31

标签: php sql postgresql transactions dbal

在一个非常大的事务中,如果发生异常以避免DB中的不一致,必须进行反转,我正在做一些操作,包括选择,更新和插入。

在下面的简化示例中,我想在“第二个操作”部分的某些条件下取消一些INSERT,同时保留“第一个操作”部分。

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

我想知道如何处理这个问题。 当$条件被击中时,我正在考虑删除INSERT,但这听起来像是一个讨厌的解决方案。

我怎样才能更清洁地处理这个问题?

$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;
}

0 个答案:

没有答案