using(var con = new SqlConnection(@"Data Source=.;Initial Catalog=pubs;Integrated Security=True"))
{
con.Open();
SqlCommand com = new SqlCommand("SELECT * FROM titles", con);
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr[1].ToString());
}
dr.Close();
}
Смотрим в профайлере — нет транзакций. Затем я пишу:
using(var con = new SqlConnection(@"Data Source=.;Initial Catalog=pubs;Integrated Security=True"))
{
con.Open();
SqlCommand com = new SqlCommand("SELECT * FROM titles", con);
var tran = con.BeginTransaction();
com.Transaction = tran;
try
{
var dr = com.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr[1].ToString());
}
dr.Close();
tran.Commit();
}
catch
{
tran.Rollback();
}
}
Одна транзакция началась и Commited... Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было?
Здравствуйте, Ellin, Вы писали:
E>Одна транзакция началась и Commited...
Можно чуть подробнее?
E>Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было?
А во втором в профайлере было две транзакции? Покажите
И в чём, собственно, вопрос-то?
Здравствуйте, vmpire, Вы писали:
Вобщем дело происходит под 2000 SQL Server.
E>>Одна транзакция началась и Commited... V>Можно чуть подробнее?
1. Строчка началась транзакция с таким-то уровнем изоляции
2. Select * ....
3. Транзация коммитет
E>>Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было?
А здесь в профайлере только одна строчка
1. Select * ...
И нету начала транзакции, какой уровень изоляции... вот это-то меня и смущает... почему не указывается что select выполняется в транзакции? Если в данном случае не указывается выполнения транзакции так может и в первом случае была транзакция в указанной транзакции?
Здравствуйте, Ellin, Вы писали:
E>>>Одна транзакция началась и Commited... V>>Можно чуть подробнее? E>1. Строчка началась транзакция с таким-то уровнем изоляции E>2. Select * .... E>3. Транзация коммитет
E>>>Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было? E>А здесь в профайлере только одна строчка E>1. Select * ... E>И нету начала транзакции, какой уровень изоляции... вот это-то меня и смущает... почему не указывается что select выполняется в транзакции? Если в данном случае не указывается выполнения транзакции так может и в первом случае была транзакция в указанной транзакции?
Как-то запутанно Вы изъясняетесь, ничего не понятно.
По коду должно быть:
— В первом случае — select без транзакции
— Во втором случае — begin transaction, select, commit transaction.
Реально происходит так или нет?
Какой из случаев непонятен?
Здравствуйте, vmpire, Вы писали:
V>Как-то запутанно Вы изъясняетесь, ничего не понятно.
Я перепутал первый со вторым... V>По коду должно быть: V>- В первом случае — select без транзакции V>- Во втором случае — begin transaction, select, commit transaction. V>Реально происходит так или нет? V>Какой из случаев непонятен?
1. Во! Так и получилось... Так вот здесь мне не понятно. Ведь в СУБД нельзя что-либо сделать без транзакции. Т.е. если я делаю select без указания begin tran и commit tran. СУБД сама заварачивает мой select в транзакцию и выполняет. Отсюда я делаю вывод, что таки неявные обертки профайлер предпочитает не показывать.
Так вот во втором случае я явно указал транзакцию. В итоге получается: 1. Явно указанная транзакция в которую завернута неявная транзакция селекта, в которую завернут сам селект (вложенность 2 транзакции); либо 2. Явно указанная транзакция в которую завернут селект. и все. Какой из двух в реальности?
2. Вот допустим я получил дата ридер при явно указании в коде на C# транзакции и что-то с ним делаю... читаю в цикли в свой объект бизнес-модели... процесс долгий — 14 сек. Так что же все эти 14 сек. транзакция держит блокировки на таблице в СУБД? (пока я commit не сделаю?)
3. 2. Вот допустим я получил дата ридер без явного указания в коде на C# транзакции и что-то с ним делаю... читаю в цикли в свой объект бизнес-модели... процесс долгий — 14 сек. Так что же все эти 14 сек. Сколько времени транзакция держит блокировки на таблице?
Здравствуйте, Ellin, Вы писали:
E>Здравствуйте, vmpire, Вы писали:
V>>Как-то запутанно Вы изъясняетесь, ничего не понятно. E> Я перепутал первый со вторым... V>>По коду должно быть: V>>- В первом случае — select без транзакции V>>- Во втором случае — begin transaction, select, commit transaction. V>>Реально происходит так или нет? V>>Какой из случаев непонятен? E>1. Во! Так и получилось... Так вот здесь мне не понятно. Ведь в СУБД нельзя что-либо сделать без транзакции. Т.е. если я делаю select без указания begin tran и commit tran. СУБД сама заварачивает мой select в транзакцию и выполняет. Отсюда я делаю вывод, что таки неявные обертки профайлер предпочитает не показывать.
Открой Ms Sql Menegment Studio и выполни тот же запрос.
Здравствуйте, Ziggi111, Вы писали: Z>Открой Ms Sql Menegment Studio и выполни тот же запрос.
Ну и что? Результат, конечно же такой же... в чем был категорически уверен до открытия Managment Studio. Всвязи с чем вопрос остался неизменным. Где транзакция при "SELECT * FROM titles" Почему профайлер ее не показывает, хотя она есть.
Здравствуйте, Ellin, Вы писали:
E>Здравствуйте, vmpire, Вы писали:
V>>Как-то запутанно Вы изъясняетесь, ничего не понятно. E> Я перепутал первый со вторым... V>>По коду должно быть: V>>- В первом случае — select без транзакции V>>- Во втором случае — begin transaction, select, commit transaction. V>>Реально происходит так или нет? V>>Какой из случаев непонятен? E>1. Во! Так и получилось...
Теперь стало понятно, что происходит. По пунктам — ниже
E>Так вот здесь мне не понятно. Ведь в СУБД нельзя что-либо сделать без транзакции.
Да, это так. По другому СУБД не умеет
E>Т.е. если я делаю select без указания begin tran и commit tran. СУБД сама заварачивает мой select в транзакцию и выполняет. Отсюда я делаю вывод, что таки неявные обертки профайлер предпочитает не показывать.
Это не обёртки. Это так называемые Autocommit Transactions — используются если пользователем явно не указана транзакция. Профайлер её не показывает, так как нечего показывать — Вы же не давали команду начинать транзакцию. А профайлер в данном случае показывает исполняемые команды, а не внутренние действия.
E>Так вот во втором случае я явно указал транзакцию. В итоге получается: 1. Явно указанная транзакция в которую завернута неявная транзакция селекта, в которую завернут сам селект (вложенность 2 транзакции); либо 2. Явно указанная транзакция в которую завернут селект. и все. Какой из двух в реальности?
Второй. Autocommit Transactions работают если ничего не указано. У вас транзакция указана явно, работает режим Explicit Transactions.
E>2. Вот допустим я получил дата ридер при явно указании в коде на C# транзакции и что-то с ним делаю... читаю в цикли в свой объект бизнес-модели... процесс долгий — 14 сек. Так что же все эти 14 сек. транзакция держит блокировки на таблице в СУБД? (пока я commit не сделаю?)
При наличии блокировок — да, держит. Какое время — зависит от isolation mode и от хинтов. По умолчанию блокировки держаться до окончания работы с таблицей (или набором строк или страниц — тут как оптимизатору захочется), но хинтом TABLOCKX могут быть искуственно продлены до конца транзакции.
E>3. 2. Вот допустим я получил дата ридер без явного указания в коде на C# транзакции и что-то с ним делаю... читаю в цикли в свой объект бизнес-модели... процесс долгий — 14 сек. Так что же все эти 14 сек. Сколько времени транзакция держит блокировки на таблице?
Если select в транзакции такой же, то блокировки держаться столько же и такие же. Только хинт TABLOCKX в этом случае смысла не имеет
Здравствуйте, Ellin, Вы писали:
E> Где транзакция при "SELECT * FROM titles" Почему профайлер ее не показывает, хотя она есть.
СУБД гарантирует, что оператор без явных транзакций будет выполняться в рамках транзакции, но это вовсе не означает что СУБД должна сама себе явно слать операторы begin tran и commit на каждый такой случай. Это было бы как минимум странно.