在單個事務中使用企業庫數據訪問塊處理批處理的一系列CRUD操作的最佳實踐是什麼,它不會被分散到分佈式事務?企業庫數據訪問塊事務管理最佳實踐
編輯全部來源:
public void BatchInsertEvents(IList<EventItem> events)
{
_dataAccessBase = new DataAccessBase("[dbo].[EventInsert]");
int count = 0;
try
{
using (var scope =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
foreach (var eventItem in events)
{
_dataAccessBase.ClearParameters();
_dataAccessBase.AddInParameter("@time",
DbType.String, eventItem.Time);
...more params
_dataAccessBase.ExecuteNonQuery();
count++;
}
scope.Complete();
}
}
我DataAccessBase僅僅是數據庫對象的包裝類
public class DataAccessBase
{
private readonly DbCommand _command;
private readonly Database _database;
public DataAccessBase(string storedProcName) : this(null, storedProcName)
{
}
public DataAccessBase(string connectionString, string storedProcName)
{
_database = string.IsNullOrEmpty(connectionString) ?
DatabaseFactory.CreateDatabase() :
DatabaseFactory.CreateDatabase(connectionString);
_command = _database.GetStoredProcCommand(storedProcName);
}
public void AddInParameter<T>(string parameterName,
DbType parameterType, T value)
{
_database.AddInParameter(_command,
parameterName, parameterType, value);
}
public void AddOutParameter<T>(string parameterName,
DbType parameterType, int parameterLength)
{
_database.AddOutParameter(_command,
parameterName, parameterType, parameterLength);
}
public void ClearParameters()
{
_command.Parameters.Clear();
}
public void ExecuteNonQuery()
{
_database.ExecuteNonQuery(_command);
}
}
這絕對不是這樣,因爲我的代碼在我的開發機器上工作正常,但我們託管的prod數據庫已關閉DTC,因此它肯定成爲分佈式事務。 – 2009-10-08 20:47:12
我想我們可能需要查看'DataAccessBase.ExecuteNonQuery'中的代碼來調試。 – 2009-10-12 14:42:40
我的意思是包括那一個,我沒有意識到我剔除了它,但這是一個微不足道的方法,爲了清楚起見,我添加了它。 – 2009-10-12 15:48:16