Транзакции позволяют выполнять набор операций в виде одного целостного пакета. И если хотя бы одна из операций из этого набора завершится неудачно, то произойдет откат выполнения остальных операций.
Для начала транзакции надо вызвать метод BeginTransaction() / BeginTransactionAsync() объекта SqlConnection
:
using System; using System.Threading.Tasks; using Microsoft.Data.SqlClient; namespace HelloApp { class Program { static async Task Main(string[] args) { string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;"; using (SqlConnection connection = new SqlConnection(connectionString)) { await connection.OpenAsync(); SqlTransaction transaction = connection.BeginTransaction(); SqlCommand command = connection.CreateCommand(); command.Transaction = transaction; try { // выполняем две отдельные команды command.CommandText = "INSERT INTO Users (Name, Age) VALUES('Tim', 34)"; await command.ExecuteNonQueryAsync(); command.CommandText = "INSERT INTO Users (Name, Age) VALUES('Kat', 31)"; await command.ExecuteNonQueryAsync(); // подтверждаем транзакцию await transaction.CommitAsync(); Console.WriteLine("Данные добавлены в базу данных"); } catch (Exception ex) { Console.WriteLine(ex.Message); // если ошибка, откатываем назад все изменения await transaction.RollbackAsync(); } } Console.Read(); } } }
Чтобы все операции с объектом SqlCommand выполнялись как одна транзакция, надо присвоить объект транзакции его свойству Transaction
:
command.Transaction = transaction;
Для завершения всех операции после их выполнения вызывается метод Commit()/CommitAsync()
объекта SqlTransaction:
transaction.CommitAsync();
Если в ходе выполнения произошла ошибка, то мы можем откатить транзакцию, вызвав метод Rollback()/RollbackAsync()
:
transaction.RollbackAsync();