MySQLデータベースをストレージに使用するASP.Net WebAPIインスタンスセットアップがあります。私は、TransactionScope
の作成を処理するActionFilter
を、1つのエンドポイント要求の存続期間にわたって書いています。MySQLと分散トランザクションを使用するTransactionScope
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
を作成し、これは単純な例であるとして、上から周りにそれを渡すことはありません必要に応じてこれを行うことができます)。また、必要に応じて接続を開いたり閉じたりすることがより良いことを読んでいます(つまり、できるだけ短い時間開いたままにしておくこと)。 using
文経由queryService
とupdateService
オープン/クローズDbConnection
年代:
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
のインスタンスを誤解/誤解していますか?
Bradly Graingerが正しいです。それはうまくいく。 MySqlConnectionの代わりに別のMySQL Connectionを使用します。MySqlConnectionはOracleによってもう開発されていないと思います。私はhttps://www.devart.com/dotconnect/mysql/で問題を解決できることを確認しました。試してみてください。 –