Я немного запутался. Я активно использую PHP RedBean в качестве ORM в своей службе прямой почтовой рассылки и сталкиваюсь с любопытной ситуацией - у меня есть таблица с уникальным ограничением ключа (т.е. subscriber_id, delivery_id) и два скрипта, которые записывают данные в эту таблицу. Есть исходный код, который вставляет или обновляет таблицу:
public static function addOpenPrecedent($nSubscriberId, $nDeliveryId)
{
$oOpenStatBean = \R::findOrDispense('open_stat', 'delivery_id = :did AND subscriber_id = :sid', array(':did' => $nDeliveryId, ':sid' => $nSubscriberId));
$oOpenStatBean = array_values($oOpenStatBean);
if (1 !== count($oOpenStatBean)) {
throw new ModelOpenStatException(
"Ошибка при обновлении статистики открытий: пара (delivery_id,
subscriber_id) не является уникальной: ($nDeliveryId, $nSubscriberId).");
}
$oOpenStatBean = $oOpenStatBean[0];
if (!empty($oOpenStatBean->last_add_dt)) {
$oOpenStatBean->precedent++;
} else {
$oOpenStatBean->delivery_id = $nDeliveryId;
$oOpenStatBean->subscriber_id = $nSubscriberId;
}
$oOpenStatBean->last_add_dt = time('Y-m-d H:i:s');
\R::store($oOpenStatBean);
}
Вызывается как из двух скриптов. И у меня периодически возникают проблемы с повреждением уникального ограничения для этой таблицы, потому что возникают условия гонки. Я знаю о функции SQL "ВСТАВИТЬ при обновлении двойного ключа". Но как я могу получить тот же результат, просто используя ORM?