学習の練習として、ORM(EFなど)を使用する前に、ADO.NETとストアドプロシージャを使用して個人用プロジェクトを作成したいと考えています。SQL Server:トランザクションでSELECTクエリをラップすると、パフォーマンス上のペナルティはありますか?
時間が経つにつれて自分のコードが混乱したくないので、リポジトリやUoWパターンのようなパターンを使いたいと思っています。
トランザクションの処理を除いて、ほとんどすべてがわかりました。
どういうわけか 'UWでシミュレート'するには、@ jgauffinによって提供されたthis classを使用しましたが、そのクラスの使用を止めるのは、そのクラスの新しいインスタンス(AdoNetUnitOfWork
)を作成するたびに、あなたがデータを読む必要があるだけの多くのケースがあります。ターンブロックに、参照されるテーブルのロックを作成することができ、トランザクション内でSELECT文を実行
これがすることができます。このこの点で
は、私はSQLの本私が読んでいるのいずれかで見つけたものです他のユーザーやセッションデータを作業を行うか、読んでから
これはAdoNetUnitOfWork
クラスです:
public class AdoNetUnitOfWork : IUnitOfWork
{
public AdoNetUnitOfWork(IDbConnection connection, bool ownsConnection)
{
_connection = connection;
_ownsConnection=ownsConnection;
_transaction = connection.BeginTransaction();
}
public IDbCommand CreateCommand()
{
var command = _connection.CreateCommand();
command.Transaction = _transaction;
return command;
}
public void SaveChanges()
{
if (_transaction == null)
throw new InvalidOperationException("Transaction have already been commited. Check your transaction handling.");
_transaction.Commit();
_transaction = null;
}
public void Dispose()
{
if (_transaction != null)
{
_transaction.Rollback();
_transaction = null;
}
if (_connection != null && _ownsConnection)
{
_connection.Close();
_connection = null;
}
}
}
そして、これは私が私のリポジトリにUOWを使用する方法である:私はトランザクションはオプションになるように、私はこのコードを少し微調整することができます知っている
public DomainTable Get(int id)
{
DomainTable table;
using (var commandTable = _unitOfWork.CreateCommand())
{
commandTable.CommandType = CommandType.StoredProcedure;
//This stored procedure contains just a simple SELECT statement
commandTable.CommandText = "up_DomainTable_GetById";
commandTable.Parameters.Add(commandTable.CreateParameter("@pId", id));
table = ToList(commandTable).FirstOrDefault();
}
return table;
}
が、私は可能な独立したプラットフォームとして、このコードをしようとしているので私がEFのような他の永続性フレームワークで知っている限り、トランザクションを手動で管理する必要はありません。問題は、このクラスをそのまま使用して、つまりトランザクションが常に作成されることで何らかのボトルネックが発生するかどうかです?
http://dba.stackexchange.com/questions/43254/is-it-a-bad-practice-to-always-create-a-transaction https://social.msdn.microsoft.com/Forums/ sqlserver/en-US/18a09050-79a8-4c83-99e6-1335a14604e0/why-wrap-just-a-select-in-a-transaction?forum = transactsql –