Вы не указали, используете ли вы .NET 2.0, но я сделаю это предположение. Пример кода C # 3.0 приведен ниже:
using (var tx = new TransactionScope()) {
// Execute multiple DB statements inside here
ts.Complete();
}
Если какой-либо из операторов DB завершится неудачно, ts.complete никогда не будет достигнут, и транзакция будет автоматически откатана по окончании оператора using. Однако одним из предостережений этого подхода является то, что в конечном итоге вы будете использовать DTC, если будете использовать несколько соединений, что означает снижение производительности.
Отредактировано для изменения SqlTransaction на TransactionScope
Пример принудительного использования одного соединения SQL, чтобы избежать использования кода DTC:
using (var tx = new TransactionScope())
using (var db = new SqlConnection(connString)) {
// Command 1
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
// Command 2
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
// Command 3
using (var cmd = db.CreateCommand()) {
cmd.CommandText = "select...";
using (var reader = cmd.ExecuteReader()) {
// Process results or store them somewhere for later
}
}
tx.Complete();
}