Нужно ли использовать транзакции базы данных с c # TableAdapters? - PullRequest
2 голосов
/ 04 ноября 2010

Я нашел эту замечательную статью Об операциях с табличными адаптерами.Тем не менее, эта статья не объясняет, почему транзакции необходимы или даже желательны!

Почему стоило бы попытаться реализовать транзакции вместе с моими адаптерами таблиц?

Ответы [ 5 ]

3 голосов
/ 04 ноября 2010

Предположим, что происходит что-то плохое, когда вы заняты сохранением чего-то, что отправляет несколько запросов в базу данных. Что вы хотите, чтобы произошло со всеми данными, которые уже были сохранены, когда вы начали операцию сохранения? Большинство разработчиков хотят аннулировать данные, которые были сохранены ранее. Ну, вот для чего предназначены транзакции: вы инкапсулируете всю логику сохранения в транзакции, чтобы в случае, если / когда что-то плохое произошло в середине, ничего не сохранялось.

Подробнее о предмете Сделки: http://en.wikipedia.org/wiki/Database_transaction

1 голос
/ 04 ноября 2010

Если у вас когда-либо есть ситуация, когда у вас есть несколько таблиц, для которых вы хотите иметь гарантированное обновление для атомарного вызова, транзакции делают это возможным.Без транзакций вы можете обновить одну таблицу, затем вторая не удастся, и у вас останутся проблемные данные.Например, у вас может быть ситуация, когда у вас один экран и вы хотите добавить родительскую запись и несколько дочерних записей одним нажатием кнопки.Без транзакций родитель успешно сохраняет данные, но одна из дочерних записей взрывается.С транзакциями вы откатываете все это и просите пользователя исправить проблему с данными.

1 голос
/ 04 ноября 2010

«Почему» будет заключаться в том, чтобы выполнять эти операции с базой данных как часть более широкой транзакционной единицы, чтобы вы могли фиксировать и другие вещи атомарным (все или ничего) способом, илиубедитесь, что чтение и запись выполняются в одной и той же транзакции (чтобы избежать фантомного / неповторяемого чтения).На самом деле я не большой поклонник модели адаптера, но ...

Для как;TransactionScope будет проще, так как соединения ADO.NET должны автоматически подключаться:

using(var tran = new TransactionScope()) {
    // do work A
    // do work B
    // do work C
    tran.Complete();
}

работа выполнена ...

0 голосов
/ 04 ноября 2010

Все, что вы, ребята, разместили здесь, звучит хорошо для меня, но мы не должны забывать, что против решения всегда есть преимущества и недостатки Например, управляя транзакцией на стороне приложения (неважно, как), вы собираетесь увеличить сетевой трафик, потому что .net должен отправить всю команду на SQL Server:

с использованием (var tran = new TransactionScope ()) {

// do work A 

// do work B 

// do work C 

tran.Complete(); 

}

В этом случае он должен отправить «начать транзакцию» и «зафиксировать».

Худшее, что может случиться, - это что произойдет, если после «// выполнить работу b» соединение разорвано? Это означает, что .Net не сможет отправить ни «откат», ни «фиксация», так что у нас будет открытая транзакция на стороне SQL Server, которая может вызвать тупиковую блокировку.

0 голосов
/ 04 ноября 2010

Транзакции позволяют поддерживать согласованность данных в базе данных. Обычно предпочтительно вводить транзакции во все обновления / вставки базы данных. Вы всегда выполняете откат, если по какой-либо причине указанная хранимая процедура завершается ошибкой.

...