Транзакции и DataReader
От: Ellin Россия www.rsdn.ru
Дата: 10.07.09 11:42
Оценка:
Пусть я пишу:
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-м случае в профайлере ничего не было?
Re: Транзакции и DataReader
От: vmpire Россия  
Дата: 10.07.09 11:59
Оценка:
Здравствуйте, Ellin, Вы писали:

E>Одна транзакция началась и Commited...

Можно чуть подробнее?

E>Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было?


А во втором в профайлере было две транзакции? Покажите
И в чём, собственно, вопрос-то?
Re[2]: Транзакции и DataReader
От: Ellin Россия www.rsdn.ru
Дата: 10.07.09 12:18
Оценка:
Здравствуйте, vmpire, Вы писали:
Вобщем дело происходит под 2000 SQL Server.

E>>Одна транзакция началась и Commited...

V>Можно чуть подробнее?
1. Строчка началась транзакция с таким-то уровнем изоляции
2. Select * ....
3. Транзация коммитет

E>>Вот тут я не могу понять. В 1-м случае ведь обязательно тоже должна быть транзакция. А во втором получается стартует транзакция внутри которой еще одна транзакция с селектом?? Во что, конечно не верится. Тогда почему в 1-м случае в профайлере ничего не было?

А здесь в профайлере только одна строчка
1. Select * ...
И нету начала транзакции, какой уровень изоляции... вот это-то меня и смущает... почему не указывается что select выполняется в транзакции? Если в данном случае не указывается выполнения транзакции так может и в первом случае была транзакция в указанной транзакции?
Re[3]: Транзакции и DataReader
От: vmpire Россия  
Дата: 10.07.09 12:26
Оценка:
Здравствуйте, 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.

Реально происходит так или нет?
Какой из случаев непонятен?
Re[4]: Транзакции и DataReader
От: Ellin Россия www.rsdn.ru
Дата: 10.07.09 12:50
Оценка:
Здравствуйте, 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 сек. Сколько времени транзакция держит блокировки на таблице?
Re[5]: Транзакции и DataReader
От: Ziggi111 Россия  
Дата: 10.07.09 13:02
Оценка:
Здравствуйте, 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 и выполни тот же запрос.
Re[6]: Транзакции и DataReader
От: Ellin Россия www.rsdn.ru
Дата: 10.07.09 13:14
Оценка:
Здравствуйте, Ziggi111, Вы писали:
Z>Открой Ms Sql Menegment Studio и выполни тот же запрос.
Ну и что? Результат, конечно же такой же... в чем был категорически уверен до открытия Managment Studio. Всвязи с чем вопрос остался неизменным. Где транзакция при "SELECT * FROM titles" Почему профайлер ее не показывает, хотя она есть.
Re[5]: Транзакции и DataReader
От: vmpire Россия  
Дата: 10.07.09 13:15
Оценка: 4 (2)
Здравствуйте, 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 в этом случае смысла не имеет

Про режимы транзакций расписано тут: http://msdn.microsoft.com/en-us/library/ms175523.aspx
Re[7]: Транзакции и DataReader
От: IB Австрия http://rsdn.ru
Дата: 10.07.09 17:18
Оценка: 10 (1)
Здравствуйте, Ellin, Вы писали:

E> Где транзакция при "SELECT * FROM titles" Почему профайлер ее не показывает, хотя она есть.

СУБД гарантирует, что оператор без явных транзакций будет выполняться в рамках транзакции, но это вовсе не означает что СУБД должна сама себе явно слать операторы begin tran и commit на каждый такой случай. Это было бы как минимум странно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1082>>
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.