Доброго времени дня всем заглянувшим. Хочу, что бы вы вникли в следующие примеры, которые по сути являются оболочкой для метода PDO::exec() и, как предполагается, должны исключить коллизии между параллельными процессами, использующими данный метод: PHP: <?php $dbh = new PDO('sqlite:'.$db_config['dbname']); //insert обращение $dbh->beginTransaction(); //Начало транзакции $contition1 = $dbh->query("select count(*) from items where item_name=".item_name[$id])->fetchAll(); if($contition1[0][0] == 0){ $dbh->exec(" insert into item (item_count,item_name) values (".item_count[$id].",".item_name[$id].") "); $dbh->commit(); //Завершение транзакции }esle $dbh->rollBack(); PHP: <?php $dbh = new PDO('sqlite:'.$db_config['dbname']); //update обращение $dbh->beginTransaction(); //Начало транзакции $contition1 = $dbh->query("select count(*) from items where item_name=".item_name[$id])->fetchAll(); $contition2 = $dbh->query("select count(*) from items where item_id=".$id)->fetchAll(); if($contition1[0][0] == 0 && $contition2[0][0] != 0){ $dbh->exec("update item set item_count=".item_count[$id]." where item_id=".$id); $dbh->commit(); //Завершение транзакции }esle $dbh->rollBack(); Их суть заключается в том, что перед внесением изменений в таблицу item скрипт проверяет отсутствие значения $item_name[$id] в поле item_name, а во втором примере - еще и наличие значения $id в поле item_id. Это позволяет быть уверенным в том, что другие процессы не успели испортить рассматриваемую таблицу до открытия транзакции. А сама транзакция и вовсе исклюцает коллизии. Так вот, глядя на эти примеры, у меня возникает вопрос: Как бы их оптимизировать по времени выполнения? Хотелось бы обсудить разные способы.
Эх. Зря потратил время на составление вопроса. Нарыл ответ уже самостоятельно: PHP: <?php $dbh = new PDO('sqlite:'.$db_config['dbname']); //update обращение $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $dbh->beginTransaction(); //Начало транзакции $res = $dbh->exec("update item set item_count=".item_count[$id]." where item_id=".$id); if($res === false) $error[] = $dbh->errorInfo(); if(isset($error)) $dbh->rollBack(); esle $dbh->commit(); //Завершение транзакции Думаю, это наиболее оптимальный способ исключения коллизий. Плюс, получаем код ошибки ($error). Если в транзакции буде не один запрос, то можно будет потом разобрать, в каком запросе и что пошло не так.