我正在为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对象调用的,也不是由父类中的某个地方调用的,当记录保存在数据库中时会使用另一个事务并且它会弄乱这个。
有人知道我的交易是如何运作的吗?
答案 0 :(得分:0)
交易只能用于支持事务的存储引擎,例如InnoDB 。所有核心Joomla表都使用InnoDB,但第三方扩展可能不会。在使用交易之前检查一下。
将表存储引擎更改为InnoDb。