Когда я вставляю новую запись в одну таблицу (work_log
), Я обновляю запись в другой таблице (employers
) с последней вставленной записью из work_log
,
Но если обновление employers
-table не удается, после того, как успешно вставлена новая запись в work_log
Мне нужно удалить только что добавленную запись в work_log
поскольку эта запись больше не будет действительной.
Вот мой сценарий до сих пор:
/**
* This first part has no direct affect on the question, but serves as additional information to understand the script better..
* - - -
* First, a new work session is inserted (this session has nothing to do with browser session)
* If this fails, the script does not continue, and the user is redirected back to the form with an error-message.
* otherwise, the script continues, and try to activate the session by adding a new work_log entry.
*/
$ins_session = $con['site']->prepare('INSERT INTO work_sessions (fields) VALUES (?)');
$ins_session->execute(array(values));
if($ins_session){
KD::notice('success','New work session is created.');
$session_id = $con['site']->lastInsertId();
} else {
KD::notice('error','Work session was not created.');
KD::redirect(); // stops the script, and redirects
}
/**
* This part affects my question
* - - -
* Add a new entry to the work log in order to automatically start the work session.
* If this entry is successfully inserted, then add an indicator to the corresponding employer, in the employers table, to indicate that this employer has an active session (and which one it is).
*/
$ins_work_log = $con['site']->prepare('INSERT INTO work_log (fields) VALUES (?)');
$ins_work_log->execute(array(values));
if($ins_work_log){
$upd_employer = $con['site']->prepare('UPDATE employers SET fk_work_sessions_id = ? WHERE id = ?');
$upd_employer->execute(array($session_id,$_POST['employer_id']));
if($upd_employer){
KD::notice('success','New session was created and started.');
KD::redirect();
} else {
// need to remove the entry from work_log.
KD::notice('Work session was created, but not started. Please start the session manually.');
}
}
Насколько я понимаю, я должен удалить последнюю вставленную запись в work_log
-Таблица?
Есть ли другой способ сделать это? например, в другом порядке или для автоматического удаления записи из work_log
если это (запрос на обновление) не удается?
work_log
-стол innoDB
и формат строки compact
если это важно знать …
ОБНОВИТЬ
Я настроил это так:
Кажется, это работает, но я немного не уверен, правильно ли я использую его в отношении операторов if / else.
$con['site']->beginTransaction();
$ins_work_log = $con['site']->prepare('INSERT INTO work_log (fields) VALUES (?)');
$ins_work_log->execute(array(values));
if($ins_work_log){
# update employer
$upd_employer = $con['site']->prepare('UPDATE employers SET fk_work_sessions_id = ? WHERE id = ?');
$upd_employer->execute(array($session_id,$_POST['employer_id']));
if($upd_employer){
$con['site']->commit();
KD::notice('success','New session was created and started.');
} else {
$con['site']->rollBack();
KD::notice('error','Work session was created, but not started. Please start the session manually.');
}
//
} else {
$con['site']->rollBack();
KD::notice('error','');
}
KD::redirect();
Будет if($ins_work_log)
, а также if($upd_employer)
, есть ли какое-либо влияние, когда запрос еще не был зафиксирован?
Это классический случай использования START TRANSACTION
, COMMIT
, а также ROLLBACK
,
http://dev.mysql.com/doc/refman/5.0/en/commit.html
Просто убедитесь, что вы используете ядро базы данных, которое его поддерживает.
псевдокод:
query("START TRANSACTION;");
query("INSERT INTO table1 ...");
if (query("INSERT INTO table2 ..."))
query("COMMIT;");
else
query("ROLLBACK;");
Других решений пока нет …