Как правильно делать явные транзакции с linq to sql? - PullRequest
0 голосов
/ 30 апреля 2010

У меня есть несколько сценариев, когда мне нужно сделать несколько вызовов .SubmitChanges () для текста данных, но я хочу сам явно контролировать транзакцию, чтобы сделать ее атомарной. Некоторое время я делал это, создавая соединение, создавая транзакцию на этом соединении, затем создавая текстовый текст и передавая оба. Предположим, что пока я не хочу использовать TransactionScope. Мой код выглядит так:

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Using trans = conn.BeginTransaction()
      Dim dc as new DataContext(conn)
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

Я начал использовать профилировщик Linq To SQL, и он нарушает этот код. По какой-то причине они требуют использования свойства .Connection в текстовом тексте для создания транзакции. Сбой, если вы используете переменную соединения напрямую (что я считаю глупым). Мой вопрос: уместнее ли это сделать так:

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Dim dc as new DataContext(conn)
   Using trans = dc.Connection.BeginTransaction()
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

Какой наиболее распространенный способ сделать это?

Ответы [ 3 ]

0 голосов
0 голосов
/ 30 апреля 2010

Второй фрагмент мне не подходит. Со вторым фрагментом вам нужно создать транзакцию после создания контекста, что, по меньшей мере, с точки зрения читаемости / удобства обслуживания менее полезно. Я пытаюсь представить, как будет выглядеть ваш код, когда вам нужно создать два DataContext класса и создать транзакцию (только) после создания первого контекста. Это делает довольно трудно поддерживать чистый разделенный код.

Я думаю, вам следует отправить письмо Hibernating Rhinos и спросить, исправят ли они эту ошибку.

0 голосов
/ 30 апреля 2010
Product prod = db.Products.Single(p => p.ProductID == 15);

if (prod.UnitsInStock > 0)
   prod.UnitsInStock--;

using(TransactionScope ts = new TransactionScope()) {
   db.SubmitChanges();
   ts.Complete();
}

http://msdn.microsoft.com/en-us/library/bb425822.aspx

...