我需要知道我的交易范围是否成功。就像记录是否能够保存在数据库中一样。
注意:我在Service层中拥有此作用域,并且我不希望包含Try-Catch块。
bool txExecuted;
using (var tx = new TransactionScope())
{
//code
// 1 SAVING RECORDS IN DB
// 2 SAVING RECORDS IN DB
tx.Complete();
txExecuted = true;
}
if (txExecuted ) {
// SAVED SUCCESSFULLY
} else {
// NOT SAVED. FAILED
}
答案 0 :(得分:1)
注释的代码将进行更新,并可能使用ExecuteNonQuery()实现-这将返回受影响的行数的整数。跟踪所有返回值以了解受影响的行数。
整个事务在完成时将成功或遇到异常。如果没有遇到异常,则说明事务成功。如果发生异常,则事务的某些部分失败;没有发生
通过考虑这两个事实(记录受影响的计数,事务异常或否),您可以知道保存是否起作用以及受影响的行数
我不太了解txExecuted的用途-如果发生异常,则永远不会设置该异常,也不会考虑if。因此,将运行的唯一代码是if(true)内部的东西。我看不到如何决定不使用try / catch,并希望对旨在在出现问题时引发异常的系统做任何有用的事情。您说不想捕获异常不会阻止异常的发生并影响程序的控制流
答案 1 :(得分:0)
要清楚,调用Complete()方法只是表示范围内的所有操作均已成功完成的指示。
但是,您还应该注意,调用此方法不会 保证交易的提交。这只是一种通知方式 您的状态的交易经理。调用此方法后,您 不能再通过Current属性访问环境交易, 并尝试这样做会引发异常。
资源管理器之间的实际提交工作发生在 如果TransactionScope对象创建了End Using语句, 交易。
由于使用的是ADO.NET,ExecuteNonQuery将返回受影响的行数。您可以在使用块的提交和外部之后进行数据库查找。
在我看来,没有尝试/捕获是一个错误。您想捕获TransactionAbortedException日志异常。
try
{
using (var scope = new TransactionScope())
{
using (var conn = new SqlConnection("connection string"))
{
}
// The Complete method commits the transaction. If an exception has been thrown,
// Complete is not called and the transaction is rolled back.
scope.Complete();
}
}
catch (TransactionAbortedException ex)
{
// log
}