2010-04-12 67 views
16

Chúng tôi có dịch vụ web trên máy chủ # 1 và cơ sở dữ liệu trên máy chủ # 2. Dịch vụ web sử dụng phạm vi giao dịch để tạo giao dịch phân phối. Mọi thứ đều chính xác.Ngoại lệ "Thao tác không hợp lệ đối với trạng thái giao dịch" bằng cách sử dụng TransactionScope

Và chúng tôi có một cơ sở dữ liệu khác trên máy chủ # 3. Chúng tôi đã gặp một số sự cố với máy chủ này và chúng tôi đã cài đặt lại hệ điều hành và phần mềm. Chúng tôi đã định cấu hình MSDTC và cố gắng sử dụng dịch vụ web từ máy chủ số 1 để giao tiếp với cơ sở dữ liệu trên máy chủ này. Và bây giờ sau khi chọn câu lệnh đầu tiên trong phạm vi giao dịch, chúng tôi nhận được: The operation is not valid for the state of the transaction. Ngoại lệ này rơi vào mọi yêu cầu dịch vụ web nếu nó đang sử dụng phạm vi giao dịch. Máy chủ # 2 và Máy chủ # 3 gần như tương tự. Sự khác biệt có thể chỉ trong cài đặt. .NET framework 3.5 SP1 được cài đặt và SQL Server SP3 trên tất cả các máy chủ.

Full stacktrace:

System.Transactions.TransactionState.EnlistPromotableSinglePhase (InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, giao dịch atomicTransaction) в System.Transactions.Transaction.EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull (Giao dịch t в System.Data.SqlClient.SqlInte rnalConnection.Enlist (Transaction t в System.Data.SqlClient.SqlInternalConnectionTds.Activate (Transaction giao dịch) в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection (Transaction giao dịch) в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory ConnectionFactory) в System.Data.SqlClient.SqlConnection.Open() в NHibernate.Connection.DriverConnectionProvid er.GetConnection() в NHibernate.Impl.SessionFactoryImpl.OpenConnection()

Tôi đã tìm kiếm thư này nhưng không tìm thấy giải pháp phù hợp. Vì vậy, tôi nên kiểm tra những cài đặt nào và tôi nên làm gì chính xác để sửa lỗi?

+0

OS gì và làm thế nào Chính xác thì bạn cấu hình MSDTC? –

+0

Bạn đang sử dụng hình thức nào của phương thức khởi tạo TransactionScope()? – gprasant

+0

Hi Lanfear, Bạn đã giải quyết được sự cố này chưa? Chúng tôi đang gặp lỗi tương tự trên môi trường thử nghiệm. Cùng một mã trên môi trường Dev hoạt động tốt. –

Trả lời

30

Lan, tôi đã gặp phải thông báo lỗi tương tự và tôi đã tìm thấy giải pháp. Tình hình của bạn có thể khác, nhưng tôi hy vọng rằng những kiến ​​thức sau sẽ hữu ích cho bạn.

System.Transactions.Transaction.Current.TransactionInformation.Status sẽ trả lại trạng thái của giao dịch hiện tại.

Trong mỗi trường hợp ngoại lệ được ném bằng thông báo The operation is not valid for the state of the transaction, khi tôi thực hiện với trình gỡ rối, tôi thấy trạng thái là "Bị hủy bỏ" trước khi ngoại lệ được ném.

Trong trường hợp của tôi, vấn đề là do làm tổ hai giao dịch bên trong lẫn nhau và xóa nhầm cả hai khi tôi chỉ muốn hủy bỏ một giao dịch. Rõ ràng, nếu bạn sử dụng hàm tạo mặc định TransactionScopeNew TransactionScope() với hai giao dịch lồng nhau, hủy bỏ giao dịch bên trong sẽ hủy bỏ giao dịch bên ngoài.Giải pháp là sử dụng Constructor New TransactionScope(TransactionScopeOption.RequiresNew) Sử dụng hàm tạo này, giao dịch bên trong sẽ là một giao dịch mới và hủy bỏ nó sẽ không hủy bỏ giao dịch bên ngoài.

Điều này giải quyết được sự cố của tôi.

+3

System.Transactions.Transaction.Current.TransactionInformation.Status đã giúp tôi xác định chính xác thời điểm giao dịch bị hủy. –

5

Bật điều phối giao dịch phân phối đã giải quyết vấn đề cho tôi (điều này được thực hiện trên cả hai máy: dịch vụ web và dịch vụ web có cơ sở dữ liệu. Không chắc chắn liệu dịch vụ web có cần thiết không).

Tôi làm theo các bước được mô tả ở đây để cho phép các DTC và để thêm một ngoại lệ đối với Windows Firewall: Enable Network DTC Access for Windows Server 2008

Các vấn đề liên quan