Tôi hơi ngạc nhiên khi bạn nhìn thấy điều này, bởi vì RequiresNew
nên có nghĩa là nó được cách ly với giao dịch khác; thông thường, thông báo này có nghĩa là 2 kết nối đã được kích hoạt bên trong một phạm vi giao dịch - bạn có chắc chắn không không có mã nào khác tạo / mở kết nối bên trong khối đó?
Giải pháp được đề xuất của bạn sẽ hoạt động - mặc dù theo một số cách TransactionScopeOption.Suppress
có thể thuận tiện hơn việc thay đổi cấu hình của bạn (nhưng một trong hai cách này sẽ hoạt động). Tuy nhiên, có một vấn đề:các giao dịch ADO.NET phải được chuyển cho các lệnh riêng lẻ, vì vậy bạn sẽ cần (cũng thu gọn mã một chút):
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
nơi CommitChanges
chấp nhận một giao dịch - có thể sử dụng các tham số tùy chọn:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
Việc bạn đặt tên cho DapperFactory
gợi ý rằng bạn đang sử dụng "dapper" - trong trường hợp đó, bạn chỉ có thể chuyển nó vào "dapper" cho dù nó là null hay không, tức là
conn.Execute(sql, args, transaction: transaction);