Tài sản máy chủ nào làm cho TransactionScope leo thang lên MSDTC?


7

Trong ứng dụng của chúng tôi, chúng tôi đang sử dụng TransactionScope. Chúng tôi đang hướng tới việc không sử dụng dịch vụ MSDTC vì nó chậm hơn rất nhiều so với các giao dịch nhẹ.

using (var transactionScope = new TransactionScope())
{
  ...
  transactionScope.Complete();
}

Trong khi kết nối với cơ sở dữ liệu kiểm tra, chúng tôi không cần MSDTC nhưng mã chính xác, được thực thi trên cùng một máy, leo thang để sử dụng MSDTC khi được kết nối với cơ sở dữ liệu sản xuất hoặc phát triển.

Cơ sở dữ liệu phát triển không được phân cụm và không phải là một thể hiện được đặt tên.

Tất cả đều là SQL Server 2008 (10.50.2500) và các chuỗi kết nối hoàn toàn giống nhau ngoại trừ tên máy chủ.

Dường như có một số khác biệt trong việc thiết lập cơ sở dữ liệu. Bất kỳ ý tưởng về những gì có thể được?

BIÊN TẬP

Giao dịch đã ở đó để bảo vệ các phần chèn trong hai bảng khác nhau. Tôi nhận thấy rằng cũng có hai cuộc gọi dẫn đến hai lựa chọn trong đó. Không cần những thứ này trong giao dịch nên tôi đã chuyển chúng ra ngoài nó. Nhu cầu về MSDTC sau đó biến mất trong cả ba cơ sở dữ liệu. Vấn đề được giải quyết nhưng không thực sự biết những gì gây ra nó.


Điều này xảy ra khi bạn có một kết nối duy nhất hoặc nhiều hơn một? Nếu có nhiều hơn một, chúng có phải là các chuỗi kết nối khác nhau không?

Trong trường hợp này, có nhiều kết nối sử dụng cùng một chuỗi kết nối. Tôi sẽ phải kiểm tra các giao dịch kết nối đơn hoạt động như thế nào.

Máy chủ sản xuất có được thiết lập tương thích ngược với SQL Server 2005 không? Nếu vậy, đó có thể là vấn đề, vì năm 2005 có một lỗi trong đó nó sẽ leo thang để phân phối bất cứ khi nào có nhiều hơn một kết nối là một phần của giao dịch.

"Mức độ tương thích: SQL Server 2008 (100)" cho cả hai.

Câu trả lời:


5

Dưới đây là một số điều bạn có thể cố gắng làm cho nó hoạt động:

  • So sánh Enlist=falsetrong chuỗi kết nối của bạn
  • So sánh MultipleActiveResultSets=truetrong chuỗi kết nối của bạn
  • Cơ sở dữ liệu cá nhân người dùng dường như hoạt động khác nhau vì một số lý do - chúng tôi không thể làm cho nó hoạt động ổn định với họ - luôn luôn sử dụng cơ sở dữ liệu đầy đủ
  • Bạn có thể sử dụng lại cùng một kết nối (đóng / mở lại) hoặc sử dụng nhiều hơn một kết nối trong một TransactionScope, nhưng bạn không thể sử dụng nhiều hơn một kết nối cùng một lúc. Tuy nhiên, bạn CÓ THỂ giữ một ThreadStatickết nối và vượt qua điều đó (hoặc, như chúng ta đã làm, sử dụng ThreadLocal<>trong lớp trình bao bọc db) - điều này đã giải quyết vấn đề tương tranh cho chúng ta trong ASP.NET, điều này gây ra sự leo thang không cần thiết
  • Đừng bận tâm nếu db của bạn <2008 hoặc nếu mức độ tương thích <100
  • Khi sử dụng chuỗi kết nối, không sử dụng thuộc ConnectionStringtính của kết nối khác để tạo kết nối mới của bạn - nó có thể không giống với kết nối ban đầu, điều này sẽ gây ra sự leo thang
  • Giữ kết nối của bạn chỉ mở miễn là bạn cần, đóng chúng trong cơ hội sớm nhất của bạn.

Những thứ tôi thấy hữu ích:


1

Trong trường hợp này, có nhiều kết nối sử dụng cùng một chuỗi kết nối

Không liên quan. Kết nối thứ hai = lan truyền đến MSDTC. Tất cả những gì bạn có thể làm là không mở nhiều kết nối. Bám sát kết nối ne và nó sẽ không lan truyền đến MSDTC. Mở một chuỗi thứ hai - cùng một chuỗi, ngay cả khi chuỗi đầu tiên được đóng - và nó phải lan truyền vì nó không thể / không sắp xếp lại việc chuyển đổi sang chuỗi mới. Điều đó làm cho nó có 2 lần chuyển đổi theo định nghĩa một giao dịch phân tán.


Điều đó đúng với SQL Server 2005 nhưng tôi đã nói rằng SQL Server 2008 đã giải quyết vấn đề đó. Thật không may cho chúng tôi, nó chỉ hoạt động với một trong ba máy chủ. Mặc dù nó chỉ hoạt động trên một trong ba máy chủ nhưng nó chứng minh câu trả lời của bạn sai. petermeinl.wordpress.com/2011/03/13/ từ

Vâng, đó là người duy nhất tôi có cho đến nay và có hàng tấn câu trả lời tương tự trên google. Tôi rất thích được cung cấp sai ở đây - làm cho việc chuyển đổi dễ dàng hơn rất nhiều.
TomTom

Tôi đã di chuyển hai lựa chọn bên ngoài giao dịch và chỉ giữ hai lần chèn (trong các kết nối riêng biệt). Bây giờ nó hoạt động trên cả ba máy chủ cơ sở dữ liệu mà không cần MSDTC.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.