【发布时间】:2013-07-22 10:39:52
【问题描述】:
我在我的 C# 代码中使用事务。在 TransactionScope 中,我记录了几乎所有内容,以确保所有内容都在测试中完成。但是,如果事务中发生了某些事情并且它去捕获我的日志类不会写任何东西。在本地主机中,我将 TransactionScopeOption 更改为“Suppress”,因为数据库不在我的服务器中。当我调试一切正常时,我可以写入日志文件。但是当我更改为“Required”时,如果它给出错误,它会像往常一样取消一切,但它也不能先写入日志。 我该如何解决这个问题?
我的代码示例:
TransactionOptions tr = new TransactionOptions();
tr.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, tr, System.Transactions.EnterpriseServicesInteropOption.Automatic))//System.TimeSpan.MaxValue))
{
bool status = false;
// this log must be written anyway but it won't when it gives an error.
LogProcess log = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction begun.");
try
{
// process 1
// process 2
.
.
.
if(status)
{
LogProcess log1 = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction will complete soon.");
scope.Complete();
LogProcess log1 = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction completed.");
}
else
{
LogProcess log2 = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction will dispose.");
scope.Dispose();
LogProcess log2 = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction disposed.");
}
}
catch(Exception ex)
{
LogProcess log1 = new LogProcess(Ssession["DBNAME"], new Guid(), "Transaction exception. Error: " + ex.Message);
scope.Dispose();
}
}
【问题讨论】:
-
日志是否也写入数据库?如果是,那是你的问题。当出现错误时,日志也会被回滚。您需要将日志包装到另一个事务中或记录到其他地方,例如文本文件。
-
@tucaz 谢谢,你是对的。但即使在 scope.Complete() 之后一切正常,它也无法写入日志。
-
这听起来像是日志记录的问题。什么是“日志处理”?我不熟悉它。它在您的应用程序的其他地方工作吗?
-
出于性能原因,大多数日志提供程序“批量”将日志写入数据库,如果您等到发出一定数量的日志请求,那么您将看到它们全部在一起。
-
我也担心 using 语句中的手动 scope.Dispose() 。您不需要它,因为它会在离开“使用”范围后立即被处置。
标签: c# asp.net transactionscope