数据库事务不会在JModelAdmin - Joomla 3.x中回滚

时间:2014-06-19 17:19:51

标签: php mysql joomla transactions

我正在为Joomla 3.x开发一个日历组件。我使用MySQL 5.5.32

在后端,我有一个表单,用于将事件数据保存在数据库中并上传图像。

为了处理图像,我扩展了JModelAdmin,并重写了保存功能。

public function save($data)
{ 
  [...]

  $db = $this->getDbo();

  try
  {
    $db->transactionStart();

    // Move uploaded image in correct folder
    if($image = FileUtility::preprocessJFormFile('image', '/images/aftevents/'))
    {
      $fileExtension = JFile::getExt($image);
      // register the image extension to be saved in the database
      $data['image_ext'] = $fileExtension;
    }


    if (parent::save($data))
    {

      // Rename image with event id
      if($image)
      {

        $id = $data['id'] ? $data['id'] : $this->getState($this->getName().'.id', 0);

        if(!$id)
        {
          throw new Exception('COM_AFTEVENTS_EXCEPTION_NO_ID', 1502);
        }

        $finalImage = JPATH_ROOT.'/images/aftevents/'. $id .'.'. $fileExtension;

        JFile::move($image, $finalImage);

        // Create thumbnails
        $params = JComponentHelper::getParams('com_aftevents');
        $params->toArray();
        $IEWidth = $params['image_event_width'];
        $IEHeight = $params['image_event_height'];
        $ICWidth = $params['calendar_image_event_width'];
        $ICHeight = $params['calendar_image_event_height'];

        $jimage = new JImage($finalImage);
        $thumbs = $jimage->createThumbs(array($IEWidth.'x'.$IEHeight, $ICWidth.'x'.$ICHeight), 5);
      }

      $db->transactionCommit();
      return true;
    }

  }
  catch (Exception $e)
  {
      // catch any database errors.
      $db->transactionRollback();

      $this->setError($e->getMessage());
      return false;
  }

  return false;
}

现在交易不起作用。如果捕获到异常,则不会回滚数据库中的插入。

我认为这是因为事务指令和数据库插入不是由同一个JDatabaseDriver对象调用的,也不是由父类中的某个地方调用的,当记录保存在数据库中时会使用另一个事务并且它会弄乱这个。

有人知道我的交易是如何运作的吗?

1 个答案:

答案 0 :(得分:0)

交易只能用于支持事务的存储引擎,例如InnoDB 。所有核心Joomla表都使用InnoDB,但第三方扩展可能不会。在使用交易之前检查一下。

将表存储引擎更改为InnoDb。