Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.NET, транзакции и QueryAnalizer / 11 сообщений из 11, страница 1 из 1
11.11.2004, 08:15
    #32776551
НЕ СКАЖУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
QueryAnalizer тоже обычная программа, которая написана толи с применением ADO, толи с ODBC. ВВодим в ней строку запроса с серверной транзакцией, и все OK.
Как в ней это реализовано? Мы ведь не можем через ADO.NET выполнить запрос с серверной транзакцией, а только с клиентской.
...
Рейтинг: 0 / 0
11.11.2004, 09:31
    #32776660
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
М.б. какие-то хитрости майкрософтовские, а лучше об этом спросить в ГФ.
...
Рейтинг: 0 / 0
11.11.2004, 09:43
    #32776688
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
В принципе транзакция всегда серверная, начать ее можно
либо написав соотв. TSQL и отправив его саморучно на выполнение,
либо вызвав некий метод класса или API функцию, который отправит тот же
begin transaction на выполнение.
Поэтому в свойство CommandText SqlCommand'а пишем
"begin transaction .......... и т. д." и вперед
...
Рейтинг: 0 / 0
12.11.2004, 01:05
    #32778588
НЕ СКАЖУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
KilroyВ принципе транзакция всегда серверная, начать ее можно
либо написав соотв. TSQL и отправив его саморучно на выполнение,
либо вызвав некий метод класса или API функцию, который отправит тот же
begin transaction на выполнение.
Поэтому в свойство CommandText SqlCommand'а пишем
"begin transaction .......... и т. д." и вперед
Так получится использовать только BEGIN TRAN и COMMIT TRAN, мы не сможем использовать болле сложные транзакции.
Т.е. так можно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static void Main(string[] args)
		{
			SqlConnection conn=new SqlConnection(@"Database=Cars;Integrated Security=true");
			SqlCommand cmd=conn.CreateCommand();
			cmd.CommandText=   @"BEGIN TRAN
                               INSERT INTO CUSTOMERS(CUSTID,FIRSTNAME,LASTNAME)
                               VALUES(8,'Alex','AlexLast');
                               COMMIT TRAN";
            
			conn.Open();
			
			Console.WriteLine(cmd.ExecuteNonQuery().ToString());
		    
conn.Close();
conn.Dispose();
		}
А так нет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
static void Main(string[] args)
		{
			SqlConnection conn=new SqlConnection(@"Database=Cars;Integrated Security=true");
			SqlCommand cmd=conn.CreateCommand();
			cmd.CommandText=   @"BEGIN TRAN
                               INSERT INTO CUSTOMERS(CUSTID,FIRSTNAME,LASTNAME)
                               VALUES(8,'Alex','AlexLast');
                               IF @@ERROR<>0
                               ROLLBACK TRAN
                               COMMIT TRAN";
            
			conn.Open();
			
			Console.WriteLine(cmd.ExecuteNonQuery().ToString());
		    
conn.Close();
conn.Dispose();
		}
Что-то происходит не то и возникает исключение соединения, а что я не очень понял.
А какой смысл использовать транзакцию T-SQL, если ты не можешь в коде T-SQL ее откатить.
...
Рейтинг: 0 / 0
12.11.2004, 11:09
    #32779064
gerss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
НЕ СКАЖУ
IF @@ERROR<>0
ROLLBACK TRAN
COMMIT TRAN


Вот тут-то собака и порылась. Если @@ERROR <> 0, то у тебя последовательно должны выполниться и rollback, и commit. То есть транзакция сначала откатывается (и заканчивается), а потом ты пытаешься ее же закоммитить.

Наверное, стоит сделать так:
Код: plaintext
1.
2.
3.
4.
if @@error <>  0 
  rollback tran
else
  commit tran

Таким образом, если ошибка - rollback, иначе - commit, транзакция будет завершена только 1 раз и ошибки должны пропасть.

Сергей
...
Рейтинг: 0 / 0
12.11.2004, 13:12
    #32779492
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
ошибки уровня 11 и выше будут вызывать SqlException. нужно еще дополнительно использовать try-catch. ошибки уровня выше 19 приводят к закрытию соединения.
...
Рейтинг: 0 / 0
12.11.2004, 21:52
    #32780663
НЕ СКАЖУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
Ясно, в чем ошибка.
кузяошибки уровня 11 и выше будут вызывать SqlException. нужно еще дополнительно использовать try-catch. ошибки уровня выше 19 приводят к закрытию соединения.
Про какие уровни ты говоришь? Да, и хочется понять в чем разница между клиентской и серверной транзакцией. Может где почитать про это можно?
...
Рейтинг: 0 / 0
12.11.2004, 22:18
    #32780673
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
НЕ СКАЖУЯсно, в чем ошибка.
кузяошибки уровня 11 и выше будут вызывать SqlException. нужно еще дополнительно использовать try-catch. ошибки уровня выше 19 приводят к закрытию соединения.
Про какие уровни ты говоришь? Да, и хочется понять в чем разница между клиентской и серверной транзакцией. Может где почитать про это можно?
1 кузя говорит про error severity в MSSQL (читайте BOL Error Message Severity Levels)

2 Серверная транзакция: для MSSQL Server-а существует только одно понятие транзакции: то, что находится, между командами BEGIN TRAN... END TRAN (ROLLBACK TRAN) Понятие IMPLICIT TRANSACTIONS для простоты опустим. В BOL подробно описана работа с транзакциями (см. Controlling Transactions)

3 "Клиентская транзакция": то, что подразумевается под "клиентской транзакцией" может включать в себя все, что угодно и зависит от реализации клиента. Откат/подтверждение состояния каких-то объектов, запись в файл, информирование пользователя и т.п.
...
Рейтинг: 0 / 0
12.11.2004, 23:24
    #32780716
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
немного дополню п.3 Alexey Kudinov

для "клиентских" транзакций выполняется, как правило два доп. батча
на trans=conn.BeginTransaction();
Код: plaintext
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTION

и на trans.Commit();
Код: plaintext
COMMIT TRANSACTION
или на trans.Rollback();
Код: plaintext
IF @@TRANCOUNT >  0  ROLLBACK TRANSACTION

в этом случае тебе дается возможность на клиенте проанализировать результат (сделать обработку данных "привычными" средствыми) выполнения операций, которые ты включаешь в транзакцию, в совокупности с другими данными своей программы и принять решение на Commit или Rollback транзакции.

это более гибкое управление, т.к. есть возможность чисто программно выполнять различные последовательности запросов в рамках одной транзакции и принимать решения по совокупности данных, связанных не только с SQL сервером, но и другими данными.

---
если принятие решений делается по принципу - была ошибка, то откатить транзакцию (как в твоем примере) - в этом случае проще и быстрее выполнить "серверную" транзакцию.
...
Рейтинг: 0 / 0
12.11.2004, 23:24
    #32780717
НЕ СКАЖУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
Alexey Kudinov
3 "Клиентская транзакция": то, что подразумевается под "клиентской транзакцией" может включать в себя все, что угодно и зависит от реализации клиента. Откат/подтверждение состояния каких-то объектов, запись в файл, информирование пользователя и т.п.
Как она(клиентская транзакция) работает? Я где-то читал(не помню про какие транзакции), что создается контекст(объект) на каждую операцию, потом, если что-то случается, то все объекты откатываются. Это тот случай? Или в ADO.NET это совсем по другому? Или клиентские транзакции на клиенте ADO.NET тоже самое тоже самое, что и серверные?
...
Рейтинг: 0 / 0
13.11.2004, 00:04
    #32780735
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET, транзакции и QueryAnalizer
НЕ СКАЖУ... создается контекст(объект) на каждую операцию, потом, если что-то случается, то все объекты откатываются. Это тот случай?это случай Distributed Transaction
c ними можно работать в ES или с использованием ServiceDomain (Win2k3, XP SP2).

для framework 2.0 поддержка распределенных транзакций доступна через TransactionScope класс.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.NET, транзакции и QueryAnalizer / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]