TransactionInDoubtException с помощью Системы. Транзакции на SQL Server 2005

Если бы dynamic_cast должен успешно выполняться, это была бы хорошая практика для использования boost::polymorphic_downcast вместо этого, который идет немного что-то вроде этого:

assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);

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

, Если Вы подозреваете, бросок мог бы сбой, и Вы хотите обнаружить его, использовать dynamic_cast и бросить к ссылочному типу. Этот состав исполнителей бросит bad_cast в случае ошибки и удалит Вашу программу. (Это хорошо, если, как Вы говорите, Вы не собираетесь восстанавливаться так или иначе)

T& t = dynamic_cast<T&>(o);
t.func(); //< Use t here, no extra check required

Использование dynamic_cast к типу указателя, только если с 0 указателями имеет смысл в контексте. Вы могли бы хотеть использовать его в if как это:

if (T* t = dynamic_cast<T*>(o)) {
    t->func(); //< Use t here, it is valid
}
// consider having an else-clause

С этой последней опцией необходимо удостовериться, что путь выполнения имеет смысл если dynamic_cast возвраты 0.

Для ответа на вопрос непосредственно: Я предпочел бы одну из двух первых альтернатив, которые я дал наличию явного assert в коде:)

5
задан Mark 17 September 2009 в 17:34
поделиться

3 ответа

Hard to advice anything without looking into your code, but my first suggestion is that TransactionScope() is an overhead when you have 1 SQL server with 1 connection.

Why not to use System.Data.SqlClient.SqlTransaction() instead?

Documentation sais that "If a connection to a remote server is opened within a database transaction, the connection to the remote server is enlisted into the distributed transaction and the local transaction is automatically promoted to a distributed transaction." However if you use really only one connection is a very strange error. Are you sure that you are not calling any 3rd party components that can create connections to MS SQL, MS MQ or something else that will require a distibuted transaction to be created?

Also if you use TransactionScope() in SQL Server CLR procedure, it will promote transaction in any case.

Also if you call a store procedure that access a table from linked SQL server, I suppose this will also require promotion.

The question is quite old, perhaps you already know the answer and could post it here for others. Thanks!

0
ответ дан 18 December 2019 в 13:18
поделиться

Меня черт побери.

У меня есть привычка вручную выполнять ExecuteNonQuery в командах «НАЧАТЬ ТРАНЗАКЦИЮ» и «COMMIT» или «ROLLBACK».

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

0
ответ дан 18 December 2019 в 13:18
поделиться

У меня на самом деле есть та же проблема, и кажется, связано с спецификацией сервера БД. У меня будет иметь ваш DBA посмотреть на использование процессора коробки, когда вы выполняете этот код. Это происходит в нашей среде, потому что мы пытаемся операцию обновления на большом количестве строк в нашей базе данных в рамках транзакции. Это происходит на нашей базе данных OLTP на одном из наших наиболее используемых таблиц, которые создадут конфликт блокировки. То, что я нахожу очаровательную проблему, - это аспект времени, который я вижу в трассе стека. Независимо от того, какие значения времени вы устанавливаете, будет ли он на команде или в качестве аргумента для конструктора трансриантов, это не кажется, что артируют проблему. То, как я собираюсь решить проблему, - это кусок коммитов. Надеюсь, это поможет

0
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: