Существует 2 основных вида транзакций; транзакции соединения и окружающие транзакции. Транзакция соединения (такая как SqlTransaction) связывается непосредственно с соединением дб (таким как SqlConnection), что означает, что необходимо продолжать раздавать соединение - хорошо в некоторых случаях, но не позволяет, "создают/используют/выпускают" использование, и не позволяет работу перекрестного дб. Пример (отформатированный для пространства):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
Не слишком грязный, но ограниченный нашим соединением "ведут". Если мы хотим обратиться к различным методам, мы теперь должны передать, "ведут" вокруг.
альтернатива является окружающей транзакцией; новый в.NET 2.0, объект TransactionScope (System.Transactions.dll) позволяет использование по диапазону операций (подходящие поставщики автоматически поступят на службу в окружающую транзакцию). Это облегчает модифицировать в существующий (нетранзакционный) код и говорить с несколькими поставщиками (хотя DTC примет участие, если Вы будете говорить с больше чем одним).
, Например:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
Примечание здесь, что эти два метода могут обработать свои собственные соединения (открывается/использует/закрывает/располагает), все же они тихо станут частью окружающей транзакции без нас имеющий необходимость передать что-либо в. Если бы
, Если Ваши ошибки в коде, Расположите (), то будет назван без Полного (), таким образом, это будет откатываться. Ожидаемое вложение и т.д. поддерживается, хотя Вы не можете откатывать внутреннюю транзакцию, все же завершают внешнюю транзакцию: если кто-либо недоволен, транзакция прерывается.
другое преимущество TransactionScope состоит в том, что он не связывается только с базами данных; любой осведомленный о транзакции поставщик может использовать его. WCF, например. Или существуют даже некоторые TransactionScope-совместимые объектные модели вокруг (т.е. классы.NET с возможностью отката - возможно, легче, чем сувенир, хотя я никогда не использовал этот подход сам).
, В целом, очень, очень полезный объект.
Некоторые протесты:
http://docs.jquery.com/Ajax/ajaxError#examples
$('#toperrorbox').ajaxError(function (event, request, settings) {
$(this).after("<p style='color:red'>"+ request.responseText +"</p>");
}
Прикрепите функцию, которая будет выполняться всякий раз, когда запрос AJAX не работает.
Прототипы Ajax.Responders
являются глобальными слушателями, которые прослушивают ВСЕ события ajax. У jQuery действительно есть эквивалент. Глобальные События Ajax .
Синтаксис немного отличается из-за природы jQuery, но что-то похожее на это должно помочь:
$('#toperrorbox').bind('ajaxError', function (event, XMLHttpRequest, ajaxOptions, thrownError) {
// thrownError only passed if an error was caught
// this == dom element listening
var message = thrownError === undefined? XMLHttpRequest.responseText : thrownError.message;
$(this).after("<p style='color:red'>"+ message +"</p>");
}
В этом случае XMLHttpRequest.responseText
будет содержать возвращенное тело (если есть) с сервера при неудачном запросе. И thrownError
будет содержать фактическое исключение, которое, как я полагаю, вам действительно нужно. Но я бы рекомендовал проверить, действительно ли было передано исключение, прежде чем пытаться распечатать его сообщение, что я сделал в моем примере. Если он поймал исключение, он будет использовать это сообщение, но если нет, он будет использовать ответ сервера.
Стоит отметить, что в jQuery все события всегда к чему-то привязаны. Обычно это узел DOM, но возможно окно
или документ
. Если вы хотите сделать то же самое, без привязки к конкретному элементу, над которым нужно действовать (как в приведенном выше примере), вы можете привязать событие к окну
и выбрать элемент (ы) для работы в ваш обратный вызов выглядит следующим образом:
$(window).bind('ajaxError', function (event, XMLHttpRequest, ajaxOptions, thrownError) {
// thrownError only passed if an error was caught
// this == dom element listening
var message = thrownError === undefined? XMLHttpRequest.responseText : thrownError.message;
$('#toperrorbox').after("<p style='color:red'>"+ message +"</p>");
}
Это может предоставить вам больший контроль над событиями, поскольку вам не нужно помнить, к каким элементам они были привязаны, и если вы не использовали анонимные функции, вы могли отвязать
] конкретные обратные вызовы по желанию.
Я не знаю прототипа, но уверен, что это примерно так :
$.ajax({
error: function(xhr, textStatus, exception) {
if (exception.message != "Syntax error") {
var newItem = '<p style="color:red">' + exception.message + '</p>';
$('#toperrorbox').after(newItem);
}
}
});
Редактировать: или вы можете попробовать что-то более глобальное:
$('#toperrorbox').ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError) {
if (thrownError != "Syntax error") {
var newItem = '<p style="color:red">' + thrownError + '</p>';
$(this).after(newItem);
}
})