DBTransaction между вызовами без сохранения состояния с использованием GUID
Я рассчитываю добавить поддержку транзакций в мой механизм БД и обеспечить обработку абстрактных транзакций вплоть до передачи Guids с помощью команды действий DB. Механизм БД будет работать так:
private static Database DB;
public static Dictionary<Guid,DBTransaction> Transactions = new ...()
public static void DoDBAction(string cmdstring,List<Parameter> parameters,Guid TransactionGuid)
{
DBCommand cmd = BuildCommand(cmdstring,parameters);
if(Transactions.ContainsKey(TransactionGuid))
cmd.Transaction = Transactions[TransactionGuid];
DB.ExecuteScalar(cmd);
}
public static BuildCommand(string cmd, List<Parameter> parameters)
{
// Create DB command from EntLib Database and assign parameters
}
public static Guid BeginTransaction()
{
// creates new Transaction adding it to "Transactions" and opens a new connection
}
public static Guid Commit(Guid g)
{
// Commits Transaction and removes it from "Transactions" and closes connection
}
public static Guid Rollback(Guid g)
{
// Rolls back Transaction and removes it from "Transactions" and closes connection
}
Система вызова будет работать так:
Guid g
try
{
g = DBEngine.BeginTransaction()
DBEngine.DoDBAction(cmdstring1, parameters,g)
// do some other stuff
DBEngine.DoDBAction(cmdstring2, parameters2,g)
// sit here and wait for a response from other item
DBEngine.DoDBAction(cmdstring3, parameters3,g)
DBEngine.Commit(g)
}
catch(Exception){ DBEngine.Rollback(g);}
Влияет ли это на пул соединений.NET (кроме случая, когда соединение случайно оставлено открытым)?
Будет ли EntLib держать соединение открытым до фиксации или отката?
1 ответ
Соединение будет оставаться открытым до фиксации или отката. Это транзакция, которая поддерживает соединение открытым.
Это не повлияет на пул соединений, кроме того, что соединение, удерживаемое транзакцией, не будет возвращено в пул соединений.
Я бы порекомендовал вам взглянуть на.net TransactionScope. Это может быть в состоянии удовлетворить ваши потребности, без написания вами этого пользовательского кода.