Возможно ли иметь транзакцию, совершить транзакцию, совершить транзакцию, и если в этой 2-й транзакции произошла ошибка, возможно ли откат обеих транзакций?cfml транзакция фиксация отката другая транзакция
Смотри ниже:
transaction action="begin" {
transaction action="SetSavepoint" savepoint="sp1";
try {
.. do something ...
transactionCommit();
}
catch (any, e) {
transactionRollback("sp1");
}
}
transaction action="begin" {
transaction action="SetSavepoint" savepoint="sp2";
try {
.. do something ...
transactionCommit();
}
catch (any, e) {
transactionRollback("sp1");
transactionRollback("sp2");
}
}
Не знаете, как работает CFML, но вы можете только одну транзакцию открытой в то время. Я подозреваю, что после завершения транзакции action = "begin" 'транзакция завершается. –
@ColonelThirtyTwo - FWIW, CFML просто пересылает команды sql в базу данных для выполнения. Таким образом, поведение такое же, как если бы вы выдавали одни и те же команды, то есть 'begin transaction, rollback, commit, ....' непосредственно в базе данных. – Leigh
Я обнаружил, что cftransaction является рискованным, у меня были случаи, когда перезапуск/тайм-аут сервера cfml оставил открытую транзакцию открытой. Блок cfcatch не помог бы в этих случаях. Теперь мы помещаем наш SQL в хранимые процедуры. Или напрямую выпишите транзакции с использованием и используйте собственные команды транзакций. Таким образом, код commit, rollback и т. Д. Отправляется на SQL Server в одном пакете, гарантируя отсутствие приостановленных транзакций. Например, при использовании MS-SQL Server вы можете установить точки сохранения таким образом. –