哪些数据库库与TransactionScope配合?

时间:2013-04-18 22:10:13

标签: c# .net tsql enterprise-library

一般情况下,是否有一个指示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形式无意义吗?最后一种形式可能是多余的吗?

1 个答案:

答案 0 :(得分:0)

回答你的问题是否有一个表明与TransactionScope兼容的界面?或者利用TransactionScope的数据库类型对象列表?

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

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