通常,是否存在指示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/