DBTransaction между вызовами без сохранения состояния с использованием GUID - PullRequest
1 голос
/ 12 марта 2010

Я хочу добавить поддержку транзакций в мой механизм БД и обеспечить обработку абстрактных транзакций вплоть до передачи руководств с помощью команды действий БД. Механизм БД будет работать примерно так:

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 Ответ

0 голосов
/ 14 марта 2010

Соединение будет оставаться открытым до фиксации или отката. Это транзакция, которая поддерживает соединение открытым.

Это не повлияет на пул соединений, кроме того, что соединение, удерживаемое транзакцией, не будет возвращено в пул соединений.

Я бы порекомендовал вам взглянуть на .net TransactionScope. Это может удовлетворить ваши потребности, без написания вами этого пользовательского кода.

...