Я запускаю php-приложение на google app engine и где-то в коде мне нужно сохранить некоторые данные в облачном хранилище данных (строка 5 здесь):
<?php
$DB = new Database($google_api_config);
foreach ($items as $item) {
$DB->save_entity("kind", item['id'], $data_to_store);
}
?>
И класс:
<?php
class Database {
//other codes...
public function save_entity($kind, $identifier, $values){
$key = $this->create_key($kind, $identifier);
$property_map = [];
foreach ($values as $value) {
$property_value = $this->create_roperty($value[0],$value[2]);
$property_map[$value[1]] = $property_value;
}
$entity = new Google_Service_Datastore_Entity();
$entity->setKey($key);
$entity->setProperties($property_map);
$mutation = new Google_Service_Datastore_Mutation();
$mutation->setUpsert([$entity]);
$req = new Google_Service_Datastore_CommitRequest();
$req->setMode('NON_TRANSACTIONAL');
$req->setMutation($mutation);
$this->dataset->commit($this->dataset_id, $req, []);
}
}
?>
Как вы можете видеть, процесс сохранения находится в цикле и должен очень быстро выполнить несколько запросов Commit. Это работает нормально, но время от времени это не так, и я вижу, что операция была выполнена частично. Некоторые предметы были сохранены, а остальные нет.
Вопрос в том:
Могу ли я выполнить весь цикл foreach в транзакции и убедиться, что все элементы были сохранены? Я также не знаю, как реализовать это в php с помощью API клиентской библиотеки PHP Datastore.
Я не совсем уверен, но как-то так:
//start a transaction
//run the loop
//terminate the transaction
Задача ещё не решена.
Других решений пока нет …