У меня проблема, когда иногда (раз в 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;
}
Здесь $ arr в foo () должен содержать уникальные значения. Код не позволяет дублировать записи в БД, проверяя, существует ли эта конкретная запись.
Чтобы проверить, работает ли базовая проверка, я смоделировал $ arr, чтобы он содержал 2 одинаковых значения. Я получаю исключение, как и ожидалось.
Тем не менее, я все еще получаю двойные записи в БД, и я озадачен тем, как это вообще возможно. Отметки времени указывают на то, что одна транзакция дублируется и выполняется параллельно. Я не смог найти никакой помощи по этому конкретному вопросу, в основном потому, что это не должно было произойти.
Я видел все примеры относительно транзакций в Joomla / PHP для использования transactionStart
, transactionCommit
, а также transactionRollback
в одной функции, но код, который я унаследовал, разделил их на 2 разные функции. Не вызовет ли это проблемы с транзакциями, такими как запуск дважды?
Задача ещё не решена.
Других решений пока нет …