Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Транзакция по умолчанию  [new]
Thor234
Member

Откуда:
Сообщений: 177
Здраствуйте.
Возможно ли для соединения определить транзакцию по умолчанию?
Пробовал так:
dbConnection.BeginTransaction(tranOptions);

но при выполнении комманд вываливается исключение, если же коммандам вручную передавать эту транзакцию, то все ок. Но лень...лень матушка заставляет подумать как бы исхитриться, чтобы не определять для каждой комманды транзакцию, а определить транзакцию по умолчанию
7 окт 12, 16:53    [13280488]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
SolYUtor
Member

Откуда:
Сообщений: 948
Thor234,

Напишите свой метод расширения, который будет создавать команду с одновременным присвоением ей транзакции.
7 окт 12, 20:28    [13280961]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
TransactionScope ?
8 окт 12, 06:02    [13281987]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
SolYUtor
Member

Откуда:
Сообщений: 948
Алексей К
TransactionScope ?


Только не забудьте предупредить человека про возможные грабли с распределёнными транзакциями.
8 окт 12, 10:27    [13282639]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
SolYUtor
Алексей К
TransactionScope ?

Только не забудьте предупредить человека про возможные грабли с распределёнными транзакциями.
Проблемы с вложенными транзакциями в "явном" DbTransaction тоже ничё так. :-)
8 окт 12, 12:19    [13283451]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
SolYUtor
Алексей К
TransactionScope ?


Только не забудьте предупредить человека про возможные грабли с распределёнными транзакциями.


о каких граблях идёт речь?
8 окт 12, 12:37    [13283610]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
pation
SolYUtor
пропущено...
Только не забудьте предупредить человека про возможные грабли с распределёнными транзакциями.

о каких граблях идёт речь?
Ну что он самовольно делает транзакцию распределённой в соответствующих случаях. Независимо от того, хотим мы этого или нет.
8 окт 12, 12:43    [13283675]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 1876
pation,

Например, не все провайдеры с ним нормально работают) Насколько я помню, Firebird не поддерживает TransactionScope, во всяком случае в EF он его игнорировал.
8 окт 12, 12:46    [13283699]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Lelouch
pation,

Например, не все провайдеры с ним нормально работают) Насколько я помню, Firebird не поддерживает TransactionScope, во всяком случае в EF он его игнорировал.


если это так, то это проблема Firebird-а, а не TransactionScope-а
8 окт 12, 13:43    [13284222]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Алексей К
pation
пропущено...

о каких граблях идёт речь?
Ну что он самовольно делает транзакцию распределённой в соответствующих случаях. Независимо от того, хотим мы этого или нет.


транзакция становится распределённой , действительно автоматически, но причём здесь TransactionScope?
он сделан как раз для того, что бы вы не думали об этом
8 окт 12, 13:45    [13284226]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
pation
транзакция становится распределённой , действительно автоматически, но причём здесь TransactionScope?
он сделан как раз для того, что бы вы не думали об этом
Я бы предпочёл самостоятельно решать, можно начинать распределённую транзакцию или нет. Если нет и она должна начаться - выдавать ошибку.
8 окт 12, 13:50    [13284260]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
SolYUtor
Member

Откуда:
Сообщений: 948
pation
транзакция становится распределённой , действительно автоматически, но причём здесь TransactionScope?
он сделан как раз для того, что бы вы не думали об этом

Это фантастика. Думать об этом надо всегда, потому что открыться может в любом неподходящем случае.
Скажем, если у нас два соединения к одной базе - то получи распределённую транзакцию.

1. Бьёт по производительности.
2. Головная боль с администрированием. Должны быть подняты MSDTC, настроены права доступа порты и тд.

Всё это напрасная растрата сил.
8 окт 12, 14:02    [13284385]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 1876
pation,

но это одни из граблей, на которые можно настпуить, используя TransactionScope)
8 окт 12, 14:30    [13284651]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
Вообще, в идеале хочется как-то так:
using (var ts = new DbTransactionScope(dbConnection))
{
    ...
    ts.Complete();
}
Но вроде как нет способа определить по DbConnection, что в нём начата транзакция (на случай вложенных DbTransactionScope). Делать 'select @@trancount' не вариант. Делать статический список слабых ссылок на соединения, в которых открыты транзакции, тоже не хочется. Проще смириться с недостатками TransactionScope. :-)
8 окт 12, 14:46    [13284813]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
SolYUtor
Member

Откуда:
Сообщений: 948
Алексей К,

Можно использовать ThreadStatic или ThreadLocal, и эмулировать нечто подобное TransactionScope.
8 окт 12, 14:55    [13284905]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
SolYUtor
Можно использовать ThreadStatic или ThreadLocal, и эмулировать нечто подобное TransactionScope.
Да не. Наверное проще забить на DbTransaction и посылать SQL-команды самостоятельно.
if @@trancount = 0 begin
    begin tran
    select 1
end else
    select 0

...

commit tran

...

if @@trancount > 0 rollback tran
8 окт 12, 15:15    [13285082]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Алексей К
pation
транзакция становится распределённой , действительно автоматически, но причём здесь TransactionScope?
он сделан как раз для того, что бы вы не думали об этом
Я бы предпочёл самостоятельно решать, можно начинать распределённую транзакцию или нет. Если нет и она должна начаться - выдавать ошибку.

вы не понимаете о чём говорите, не хотите делать распределённую транзакцию размещайте ваши команды в отдельном скопе
8 окт 12, 15:44    [13285357]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
SolYUtor
pation
транзакция становится распределённой , действительно автоматически, но причём здесь TransactionScope?
он сделан как раз для того, что бы вы не думали об этом

Это фантастика. Думать об этом надо всегда, потому что открыться может в любом неподходящем случае.
Скажем, если у нас два соединения к одной базе - то получи распределённую транзакцию.

1. Бьёт по производительности.
2. Головная боль с администрированием. Должны быть подняты MSDTC, настроены права доступа порты и тд.

Всё это напрасная растрата сил.




pation
вы не понимаете о чём говорите, не хотите делать распределённую транзакцию размещайте ваши команды в отдельном скопе
8 окт 12, 15:46    [13285365]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Lelouch
pation,

но это одни из граблей, на которые можно настпуить, используя TransactionScope)


пока граблей не увидел
8 окт 12, 15:46    [13285372]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
SolYUtor
Member

Откуда:
Сообщений: 948
pation
вы не понимаете о чём говорите, не хотите делать распределённую транзакцию размещайте ваши команды в отдельном скопе

Ой ли? Есть код с использованием сторонней библиотеки, которая лезет в базу и что-то туда пишет/читает. И ваш тоже код тоже пишет в базу, может быть даже в другую. И всё это под TransactionScope. Вуаля, распределённая транзакция!
8 окт 12, 15:51    [13285420]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
pation
Алексей К
пропущено...
Я бы предпочёл самостоятельно решать, можно начинать распределённую транзакцию или нет. Если нет и она должна начаться - выдавать ошибку.

вы не понимаете о чём говорите, не хотите делать распределённую транзакцию размещайте ваши команды в отдельном скопе
Даже с одним скопом и одним конекшеном можно огрести распределённую транзакцию. Оно нам надо?
using (var ts = new TransactionScope()) // Распределённая транзакция, здравствуйте!
using (var cn = new SqlConnection("..."))
{
    cn.Open();

    ..........

    ts.Complete();
}


А в этом случае транзакция будет локальной:
using (var cn = new SqlConnection("..."))
{
    cn.Open();
    using (var ts = new TransactionScope())
    {
        ..........

        ts.Complete();
    }
}
8 окт 12, 15:53    [13285439]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Алексей К
SolYUtor
Можно использовать ThreadStatic или ThreadLocal, и эмулировать нечто подобное TransactionScope.
Да не. Наверное проще забить на DbTransaction и посылать SQL-команды самостоятельно.
if @@trancount = 0 begin
    begin tran
    select 1
end else
    select 0

...

commit tran

...

if @@trancount > 0 rollback tran


конешно, а лучше вообще пересесть на ассемблер
8 окт 12, 15:53    [13285441]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
Алексей К
pation
пропущено...

вы не понимаете о чём говорите, не хотите делать распределённую транзакцию размещайте ваши команды в отдельном скопе
Даже с одним скопом и одним конекшеном можно огрести распределённую транзакцию. Оно нам надо?
using (var ts = new TransactionScope()) // Распределённая транзакция, здравствуйте!
using (var cn = new SqlConnection("..."))
{
    cn.Open();

    ..........

    ts.Complete();
}


нет!
8 окт 12, 15:54    [13285450]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
pation
Алексей К
пропущено...
Даже с одним скопом и одним конекшеном можно огрести распределённую транзакцию. Оно нам надо?
using (var ts = new TransactionScope()) // Распределённая транзакция, здравствуйте!
using (var cn = new SqlConnection("..."))
{
    cn.Open();

    ..........

    ts.Complete();
}


нет!
В MSSQL2008 может и нет. А в остальных СУБД - да.

Ещё с DB2 были проблемы - он в принципе не поддерживает простые транзакции через TransactionScope, только распределённые.
8 окт 12, 16:00    [13285508]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция по умолчанию  [new]
Алексей К
Member

Откуда: Новосибирск
Сообщений: 13632
pation
Алексей К
пропущено...
Да не. Наверное проще забить на DbTransaction и посылать SQL-команды самостоятельно.
if @@trancount = 0 begin
    begin tran
    select 1
end else
    select 0

...

commit tran

...

if @@trancount > 0 rollback tran


конешно, а лучше вообще пересесть на ассемблер
Причём тут ассемблер. Такая штука пишется максимум за час со всеми бантиками для кроссубдности. А пример прикладного кода я показал выше, практически ничем не отличается от родного TransactionScope.
8 окт 12, 16:03    [13285532]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить