2010-03-12 26 views
1

我正在寻求将事务支持添加到我的数据库引擎,并提供给抽象事务处理,直至在Guid中传递数据库操作命令。数据库引擎可以运行类似:使用GUID的无状态调用之间的DBTransactions

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会保持连接打开,直到提交或回滚?

回答

0

连接将保持打开直到提交或回滚。这是保持连接畅通的交易。

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

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

+0

感谢您的回答。 TransactionScope不会工作,因为需要将Begin和Commit函数暴露给也通过Web服务连接的客户端(允许通过各种非顺序无状态调用进行事务支持)。 – 2010-03-15 15:28:15

相关问题