通常,是否存在指示TransactionScope意识的界面?有使用TransactionScope的常见数据库列表吗? (是否有任何扩展DbConnection或实现IDbConnection的东西?)

TransactionScope与合作数据库之间有什么关系?即TransactionScope是否以某种方式搜索活动连接并调用适当的begin / commit / rollback方法?数据库是否查找环境TransactionScope?或两者?

背景(如果需要)。我正在处理一个旧的DAL,它利用了几种不同的类似交易的策略:

//
// transactionless queries
//

// Microsoft.Practices.EnterpriseLibrary.Data. ...
Database db = SQLHelper.GetDatabase();
DbCommand cmd = db.GetStoredProcComment("doSomething");
db.AddInParameter(cmd, "p1", DbType.Guid, Id);
using (IDataReader r = db.ExecuteReader())
{
  // etc.
}


//
// Transaction objects being passed around and attached to DbCommands
//

// somewhere up the line ...
DbConnection con = TransactionScopeConnections.GetConnection(db);
DbTransaction transaction = con.BeginTransaction();

// Microsoft.Practices.EnterpriseLibrary.Data. ...
Database db = SQLHelper.GetDatabase();
DbConnection con = TransactionScopeConnections.GetConnections(db);
DbCommand cmd = db.GetStoredProcComment("doSomething");
cmd.Transaction = transaction;
db.AddInParameter(cmd, "p1", DbType.Guid, Id);
using (IDataReader r = db.ExecuteReader())
{
  // etc.
}


//
// queries in TransactionScopes
//

using (TransactionScope scope = new TransactionScope())
{
  // Microsoft.Practices.EnterpriseLibrary.Data. ...
  Database db = SQLHelper.GetDatabase();
  DbCommand cmd = db.GetStoredProcComment("doSomething");
  db.AddInParameter(cmd, "p1", DbType.Guid, Id);
  using (IDataReader r = db.ExecuteReader())
  {
    // etc.
  }
  scope.Complete();
}


//
// both
//

Database db = SQLHelper.GetDatabase();
using (TransactionScope transactionScope = new TransactionScope())
{
    DbConnection con = TransactionScopeConnections.GetConnection(db);
    DbTransaction transaction = con.BeginTransaction();

    /* ... build query ... */

    query.transaction = transaction;

    /* ... execute query, read results, if any ... */

    transaction.Commit();
    transactionScope.Complete();

}


这些都是企业库中所有有效的选项吗? TransactionScope形式没有意义吗?最后一种形式可能多余吗?

最佳答案

要回答您的问题,是否存在一个指示与TransactionScope兼容的接口?还是利用TransactionScope的数据库类型对象的列表?

是的,您可以考虑使用IDBTransaction接口来涵盖.NET Framework数据提供程序访问关系数据库的实现。

当您希望将事务提升为完全分布式事务(例如MSDTC)时,我使用TransactionScope的方式。 TransactionScope本身不仅限于ADO.NET,可以参考Scope and More

关于c# - 哪些数据库库与TransactionScope合作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16093942/

10-13 06:11