Ответ 1
Объекты соединения, транзакции и команды - это просто транспортные средства для отправки команд в базу данных. После выполнения команды база данных ее получила. Независимо от того, что вы делаете с объектом команды впоследствии, уничтожайте его, сжигайте или стреляйте в луну, этот факт не меняется. (Его можно отбросить только назад).
Вы можете создавать и удалять столько команд, сколько хотите, в пределах одного SqlConnection
(с или без SqlTransaction
). И вы можете запускать и размещать столько транзакций, сколько хотите, за один SqlConnection
. Чтобы продемонстрировать это, см.:
using (var conn = new SqlConnection(@"server=(local)\sql2008;database=Junk;Integrated Security=SSPI"))
{
conn.Open();
// Repeat this block as often as you like...
using (var tran = conn.BeginTransaction())
{
using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess1')", conn, tran))
{
cmd.ExecuteNonQuery(); // Shows in Sql profiler
}
tran.Commit(); // Commits
}
using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess2')", conn))
{
cmd.ExecuteNonQuery(); // Executes and commits (implicit transaction).
}
}
Конечно, для здорового кода вам нужно распоряжаться всеми объектами в правильном порядке. Устранение команды после удаления SqlConnection
может привести к тому, что объект соединения останется в памяти.