我有一個ASP.Net WebAPI實例設置,使用MySQL數據庫進行存儲。我寫了一個ActionFilter
,它處理在單個端點請求的生命週期中創建TransactionScope
。TransactionScope與MySQL和分佈式事務
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
HttpActionContext actionContext,
CancellationToken cancellationToken,
Func<Task<HttpResponseMessage>> continuation)
{
var transactionScopeOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };
using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew, transactionScopeOptions, TransactionScopeAsyncFlowOption.Enabled))
{
var handledTask = await continuation();
transaction.Complete();
return handledTask;
}
}
然後在整個端點我有不同的查詢/,使用的DbConnection
的的autoenlist=true
功能打開/關閉連接命令。一個例子端點可以是:
public async Task<IHttpActionResult> CreateStuffAsync()
{
var query = this.queryService.RetrieveAsync();
// logic to do stuff
var update = this.updateService.Update(query);
return this.Ok();
}
我不創建一個單一的DbConnection
從頂部周圍通過它,因爲這是一個簡單的例子,在實踐中通過服務之間的連接將需要大量重構(儘管如有必要,這可以完成)。我還了解到,最好在必要時打開/關閉連接(即儘可能少地打開連接)。該queryService
和updateService
打開/關閉DbConnection
「通過using
聲明S:
var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = "Data Source=localhost;Initial Catalog=MyDatabase;User ID=user;Password=password;Connect Timeout=300;AutoEnlist=true;";
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
var result = await connection.QueryAsync(Sql).ConfigureAwait(false);
return result;
}
同樣DbConnection
一般不使用相同的API端點的請求中的多個查詢 - 但同樣的連接字符串。
間歇我看到試圖打開連接時拋出的異常:
我不明白爲什麼它正在嘗試交易升級爲分佈式事務,當所有的連接都反對同一數據庫。或者我誤解/濫用TransactionScope
和DbConnection
實例?
布拉德格蘭傑是正確的。它運作良好。我使用另一個MySQL連接而不是MySqlConnection。我想MySqlConnection不是由Oracle開發的。我確認https://www.devart.com/dotconnect/mysql/可以解決您的問題。請嘗試。 –