C# 使用GUID的无状态调用之间的DBTransactions

C# 使用GUID的无状态调用之间的DBTransactions,c#,ado.net,transactions,enterprise-library,C#,Ado.net,Transactions,Enterprise Library,我希望向我的DB引擎添加事务支持,并提供抽象事务处理,直至使用DB Action命令传入GUI。DB引擎的运行方式类似于: private static Database DB; public static Dictionary<Guid,DBTransaction> Transactions = new ...() public static void DoDBAction(string cmdstring,List<Parameter> parameters,Guid

我希望向我的DB引擎添加事务支持,并提供抽象事务处理,直至使用DB Action命令传入GUI。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会在提交或回滚之前保持连接打开吗?

在提交或回滚之前,连接将保持打开。正是事务使连接保持打开状态

它不会影响连接池,但事务持有的连接不会返回到连接池


我建议您查看.net TransactionScope。这可能能够满足您的需要,而无需编写任何自定义代码。

谢谢您的回答。TransactionScope无法工作,因为需要向也通过web服务连接的客户端公开Begin和Commit函数(允许通过各种非顺序无状态调用提供事务支持)。