我有一个问题,有时(每 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 中使用transactionStart
、transactionCommit
和transactionRollback
在单个函数中的事务的示例,但是我继承的代码已将它们拆分为 2 个不同的函数。这是否会导致事务出现问题,例如运行两次?