我有一个n层C#ASP .Net应用程序服务器,它使用存储过程与数据库通信。
我有一个服务层,如果使用TransactionScope.requiresNew抛出异常,它会回滚所有ADO .net事务。
在我的存储过程中,我想跟踪登录尝试次数,因此我们希望按原样保留事务框架,但希望有一个我们提交的独立事务。
我该怎么做?
我尝试在数据层中使用新的TransactionScope.RequiresNew,但这没有效果。
答案 0 :(得分:0)
奇怪 - 需要新的内部(日志记录)TransactionScope应该可以工作。
在下面的嵌套事务中,TransactionScopeOption.Suppress或TransactionScopeOption.RequiresNew都适用于我 - 内部事务已提交(Dal2.x),外部事务已中止(Dal1.x)。
try
{
using (TransactionScope tsOuter = new TransactionScope(TransactionScopeOption.Required))
{
DAL1.Txn1();
using (TransactionScope tsLogging = new TransactionScope(TransactionScopeOption.Suppress))
{
DAL2.Txn2();
tsLogging.Complete();
}
throw new Exception("Big Hairy Exception");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
编辑:应避免混合使用TransactionScope和显式T-SQL事务 - 这在您引用的同一链接中说明,http://msdn.microsoft.com/en-us/library/ms973865.aspx,引用如下
TransactionScopes非常智能地管理事务升级 - 他们将使用(例如,只有当事务跨越多个数据库或资源时才使用DTC - 例如SQL和MSMQ)。它们还可以使用SQL 2005+轻量级事务,因此在事务中也可以管理到同一数据库的多个连接,而不会产生DTC的开销。
恕我直言,关于是否使用Suppress vs RequiresNew的决定将取决于你是否需要在一个事务中进行审计 - RequiresNew是一个孤立的txn,vs Suppress for none。
使用System.Transactions时, 申请不应直接 利用交易编程 资源管理器上的接口 例如T-SQL BEGIN TRANSACTION或 COMMIT TRANSACTION动词,或者 MessageQueueTransaction()对象 System.Messaging命名空间,何时 处理MSMQ。那些机制 会绕过分布式的 交易管理由 System.Transactions,并结合使用 使用System.Transactions与这些 资源经理“内部” 交易会导致不一致 结果....永远不要混合两个