一般情况下,是否有一个指示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
形式无意义吗?最后一种形式可能是多余的吗?
答案 0 :(得分:0)
回答你的问题是否有一个表明与TransactionScope兼容的界面?或者利用TransactionScope的数据库类型对象列表?
是的,您可以考虑使用IDBTransaction
接口来介绍.NET框架数据提供程序访问关系数据库的实现。
当您希望将事务提升为完整的分布式事务(如MSDTC)时,我看到使用TransactionScope
的方式。 TransactionScope
本身并不仅限于ADO.NET,您可以参考Scope and More