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. Это может быть в состоянии удовлетворить ваши потребности, без написания вами этого пользовательского кода.

Другие вопросы по тегам