У кого-нибудь есть опыт, которым он может поделиться, используя MySQL точки сохранения (напрямую или через ORM), особенно в нетривиальном веб-сервисе? Где вы на самом деле использовали их? Являются ли они достаточно надежными (если вы готовы запустить довольно свежую версию MySQL) или слишком инновационными или дорогими?
Наконец, кто-нибудь имел опыт работы с чем-то вроде следующего варианта использования, и вы использовали для этого точки сохранения? Скажем, основной смысл какой-то конкретной единицы работы - добавить строку в таблицу Orders
(или что-то еще, разумеется, не обязательно должно быть связано с заказом) и обновить таблицу OrdersAuditInfo
в той же транзакции , Важно, чтобы Orders
было обновлено, если это вообще возможно, но таблица OrdersAuditInfo
не так важна (например, можно просто записать ошибку в файл, но продолжить выполнение всей транзакции). На низком уровне это может выглядеть так (предупреждение, псевдо-SQL следует):
BEGIN;
INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
ROLLBACK and report an error (i.e., Order is invalid in this
case anyway). */
SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;
/* Always want to commit the INSERT INTO Orders: */
COMMIT;
Но даже здесь, возможно, найдется лучшая (или, по крайней мере, более распространенная) идиома? Можно сделать вставку OrdersAuditInfo
в совершенно другой транзакции, но было бы неплохо гарантировать, что таблица OrdersAuditInfo
будет не записана, если только окончательная COMMIT
фактически не сработает.