2013-04-12 20 views
1

我已经成功地在Joomla中创建了一个用户可以更新数据库内容的组件。问题是我有两个查询要执行,如果第二个查询失败,第一个查询完成的更改应该被丢弃。我试过这些代码,它不给我回滚:如何在Joomla 1.5中创建SQL事务?

$db = JFactory::getDBO(); 

    $db->setQuery("BEGIN"); 
    $db->query(); 
    $db->setQuery($delete_script); 
    $db->query(); 
    $db->setQuery($update_script); 
    $db->query(); 

    if($db->getErrorMsg()) 
    { 
     $db->setQuery("ROLLBACK"); 
     $db->query(); 
     JFactory::getApplication()->enqueueMessage(JText::_($sql_script . 'An error occurred while saving loan types. Please check formatting and try again.'), 'error'); 
    } 
    else 
    { 
     $db->setQuery("COMMIT"); 
     $db->query(); 
     JFactory::getApplication()->enqueueMessage(JText::_('Loan types have been saved successfully!'), 'message'); 

    } 

    JRequest::setVar('view', 'loantypes'); 
    parent::display(); 

那么你如何在Joomla 1.5中创建一个事务?

回答

0

你应该执行这样的:

$db = JFactory::getDBO(); 

$db->setQuery("BEGIN"); 
$db->query(); 

$db->setQuery($delete_script); 
$db->query(); 
if($db->getErrorMsg()) { 
    $db->setQuery("ROLLBACK"); 
    $db->query(); 
    JFactory::getApplication()->enqueueMessage(JText::_($sql_script . 'An error occurred while saving loan types. Please check formatting and try again.'), 'error'); 
} 
$db->setQuery($update_script); 
$db->query(); 

if(!$db->getErrorMsg()) { 
    $db->setQuery("COMMIT"); 
    $db->query(); 
    JFactory::getApplication()->enqueueMessage(JText::_('Loan types have been saved successfully!'), 'message'); 

} 

JRequest::setVar('view', 'loantypes'); 
parent::display(); 

回滚必须在近期执行的查询被执行。

+0

实际上,'$ update_query'是产生错误的那个,我想放弃'$ delete_query'完成的更改(如果发生的话)。那可能吗? – dpp

+0

如果您的更新查询不起作用,那么您的逻辑是正确的。它应该回滚最近执行的查询。你只需要在'BEGIN'之前使用'START TRANSACTION'。休息很好。 – Harpreet