Несколько подключений к одной и той же БД в одном TransactionScope - PullRequest
0 голосов
/ 08 ноября 2019

Как обрабатываются соединения в одной транзакции, когда мы открываем закрытые соединения для каждого оператора в C #?

Сценарий с такой же строкой соединения , и соединение открывается и закрываетсянесколько типов, один раз для каждого оператора.

Рассмотрим следующий пример

void updateSomething() {
    using (SqlConnection connection = new SqlConnection(  
      "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();        
        // Execute the statements
        connection.Close();  
    }  
 }

Когда я выполняю следующий код:

void SomeMethod()
{
    using(TransactionScope scope = new TransactionScope())
    {
        for(int i=0; i < 10; i++) 
        {
            this.updateSomething();
        }
        scope.Complete();
    }
}

Рекомендуется использоватьсоединение Open / Close для каждого оператора. Это потому, что мы на самом деле не создаем соединения, мы просто используем соединение из пула.

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

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

Не имеет ли смыслаоставить одно соединение открытым на время транзакции?

1 Ответ

1 голос
/ 08 ноября 2019

Рекомендуется использовать соединение Open / Close для каждого оператора.

Не видя этого комментария в контексте, я полагаю, что эта рекомендация из-за того, что вы сказали: созданиеи уничтожение SqlConnection объектов не означает, что вы создаете и уничтожаете сетевые подключения.

Я думаю, что мотив «использовать один для каждого оператора» состоит в том, чтобы просто не беспокоиться о том, чтобы пытаться быть эффективными при созданииSqlConnection объектов. Не изо всех сил старайтесь сохранить один и распространять его по всему коду, думая, что вы избегаете разрывать сетевое соединение. В этом нет никакого смысла.

В вашем примере это не будет иметь большого значения. Вы можете использовать один и тот же объект SqlConnection для каждого запроса, если хотите, если вы делаете их последовательно, а не параллельно. Это, вероятно, даже немного более эффективно, поскольку вы экономите вычислительное время на создании SqlConnection объекта. Но это сэкономленное время, вероятно, даже не будет заметно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...