运行 Yii 中的事务查询 1.x
Run transaction queries in Yii 1.x
我正在尝试 运行 使用 Yii 1.x 的事务查询 - 如果出现问题,这基本上应该回滚所有查询,人们可以确认这是 [=16 的正确方法=] 使用 Yii 1 的交易?
// data comes from a csv
$transaction = Yii::app()->db->beginTransaction();
try
{
if (($handle = fopen($path, "r")) !== false) {
while (($data = fgetcsv($handle)) !== FALSE) {
if ($currentRow == 1) {
$header = $this->import_fields(array_map('strtolower', $data));
$currentRow++;
continue;
} else {
$data = array_combine($header, $data);
$csv_import_model = null;
if (!empty($data['username'])) {
$csv_import_model = StudentImportForm::model()->findByAttributes(array(
'username' => $data['username'],
'organisation_id' => user()->data->organisation->getViewOrgId()
));
}
if (is_null($csv_import_model)) {
$csv_import_model = new StudentImportForm();
$isNew = true;
} else {
$isNew = false;
}
$csv_import_model->scenario = 'import';
$csv_import_model->setAttributes($data);
$csv_import_model->unsetAttributes(array('password'));
if ($csv_import_model->validate()) {
if (in_array($csv_import_model->username, $processedUsername)) {
$csv_import_model->addError('username', sprintf('Duplicate username (%1$s) found in csv file. which may already exists on row number %2$s.', $csv_import_model->username, (array_search($csv_import_model->username, $processedUsername) + 1)));
} else {
if ($csv_import_model->save()) {
if ($isNew) {
$this->csv_results['inserted'] = $this->csv_results['inserted']+1;
} else {
$this->csv_results['updated'] = $this->csv_results['updated']+1;
}
} else {
$this->csv_results['error'][$currentRow] = $csv_import_model->getErrors();
}
}
} else {
$csv_import_model->csv_index = $currentRow;
$this->csv_results['error'][$currentRow] = $csv_import_model->getErrors();
}
$processedUsername[] = $csv_import_model->username;
$currentRow++;
Yii::getLogger()->flush(false);
}
}
fclose($handle);
}
$transaction->commit();
}
catch(Exception $e)
{
$transaction->rollback();
}
$model->save() 在失败时不会抛出异常。它 returns 对或错。为了回滚整个块,如果 save() returns false,您必须手动抛出异常。尝试这样的事情:
$errors = null;
try {
if ($csv_import_model->save()) {
// continue with whatever logic you have
$transaction->commit();
}else{
$errors = 'Error when saving';
throw new Exception('Could not save model');
}
}catch(Exception $e){
//Do some logging here
$transaction->rollback();
if($errors != null){
Yii::app()->user->setFlash('error', $errors);
}
}
我正在尝试 运行 使用 Yii 1.x 的事务查询 - 如果出现问题,这基本上应该回滚所有查询,人们可以确认这是 [=16 的正确方法=] 使用 Yii 1 的交易?
// data comes from a csv
$transaction = Yii::app()->db->beginTransaction();
try
{
if (($handle = fopen($path, "r")) !== false) {
while (($data = fgetcsv($handle)) !== FALSE) {
if ($currentRow == 1) {
$header = $this->import_fields(array_map('strtolower', $data));
$currentRow++;
continue;
} else {
$data = array_combine($header, $data);
$csv_import_model = null;
if (!empty($data['username'])) {
$csv_import_model = StudentImportForm::model()->findByAttributes(array(
'username' => $data['username'],
'organisation_id' => user()->data->organisation->getViewOrgId()
));
}
if (is_null($csv_import_model)) {
$csv_import_model = new StudentImportForm();
$isNew = true;
} else {
$isNew = false;
}
$csv_import_model->scenario = 'import';
$csv_import_model->setAttributes($data);
$csv_import_model->unsetAttributes(array('password'));
if ($csv_import_model->validate()) {
if (in_array($csv_import_model->username, $processedUsername)) {
$csv_import_model->addError('username', sprintf('Duplicate username (%1$s) found in csv file. which may already exists on row number %2$s.', $csv_import_model->username, (array_search($csv_import_model->username, $processedUsername) + 1)));
} else {
if ($csv_import_model->save()) {
if ($isNew) {
$this->csv_results['inserted'] = $this->csv_results['inserted']+1;
} else {
$this->csv_results['updated'] = $this->csv_results['updated']+1;
}
} else {
$this->csv_results['error'][$currentRow] = $csv_import_model->getErrors();
}
}
} else {
$csv_import_model->csv_index = $currentRow;
$this->csv_results['error'][$currentRow] = $csv_import_model->getErrors();
}
$processedUsername[] = $csv_import_model->username;
$currentRow++;
Yii::getLogger()->flush(false);
}
}
fclose($handle);
}
$transaction->commit();
}
catch(Exception $e)
{
$transaction->rollback();
}
$model->save() 在失败时不会抛出异常。它 returns 对或错。为了回滚整个块,如果 save() returns false,您必须手动抛出异常。尝试这样的事情:
$errors = null;
try {
if ($csv_import_model->save()) {
// continue with whatever logic you have
$transaction->commit();
}else{
$errors = 'Error when saving';
throw new Exception('Could not save model');
}
}catch(Exception $e){
//Do some logging here
$transaction->rollback();
if($errors != null){
Yii::app()->user->setFlash('error', $errors);
}
}