1

我有一个问题,有时(每 1-3 个月一次)事务会运行两次,因此数据会两次输入数据库。

以下是正在发生的事情的要点:

function foo()
{
   $arr = getsomeArray();
   $db = JFactory::getDbo();

   try
   {
      bar($arr);
   }
   catch(Exception $e)
   {
      $db->transactionRollback();
   }
}

function bar($arr)
{
   $db = JFactory::getDbo();

   $db->transactionStart();

   // series of inserts and updates
   // but if any fail, then throw Exception

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

这里, foo() 中的 $arr 应该包含唯一值。该代码通过检查特定条目是否已存在来防止将重复条目插入数据库。

为了测试基本检查是否有效,我模拟了 $arr 以包含 2 个相同的值。我收到了预期的异常。

但是,我仍然在数据库中获得双重条目,我很难理解它是如何可能的。时间戳表明单个事务被复制并且两者并行运行。我无法在这个特定问题上找到任何帮助,主要是因为它不应该发生。

我已经看过所有关于在 Joomla/PHP 中使用transactionStarttransactionCommittransactionRollback在单个函数中的事务的示例,但是我继承的代码已将它们拆分为 2 个不同的函数。这是否会导致事务出现问题,例如运行两次?

4

0 回答 0