为什么我在使用 TransactionScope 时出错?
Why Am I Getting Error Using TransactionScope?
各位!
我在使用 TransactionScope 时遇到问题。我希望我的网络方法是事务性的。如果发生任何异常,我希望回滚所有数据库更改。否则,提交。请参阅下面的错误消息。
System.ApplicationException: Error in someClass :: Method public
returnType methodName(parameterType parameter) :
System.ApplicationException: Error in someClass :: Method private
string someMethod() :
System.Data.Odbc.OdbcException (0x80131937):
ERROR [08003] [Sybase][ODBC Driver]Connection not open
at System.Data.Odbc.OdbcConnection.Open_EnlistTransaction(Transaction
transaction)
at System.Data.Odbc.OdbcConnectionOpen.EnlistTransaction(Transaction
transaction)
at System.Data.Odbc.OdbcConnection.EnlistTransaction(Transaction
transaction)
at System.Data.Odbc.OdbcConnection.Open()
at someNameSpace.someMethod() in c:\somePath\someClass.cs:line 35
以下是我的代码摘录。我做错了什么?
[WebMethod]
public returnType methodName(parameterType parameter)
{
using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
var someValue = someMethod();
:
:
:
transactionScope.Complete();
return response;
}
catch (Exception ex)
{
return ErrorMessages(ex);
}
}
}
private string someMethod()
{
var commandText = "...some valid SQL expression...";
var commandType = CommandType.Text;
try
{
using (var odbcConnection = new OdbcConnection(DefaultDbConnection.ToString()))
{
using (var odbcCommand = new OdbcCommand(commandText, odbcConnection))
{
odbcConnection.Open(); // Exception is thrown here!
odbcCommand.CommandType = commandType;
using (var reader = odbcCommand.ExecuteReader())
{
reader.Read();
return reader.GetString(0);
}
}
}
}
catch (Exception ex)
{
throw new ApplicationException("Error in someMethod.", ex);
}
}
在此先感谢您的帮助!
最终,并非所有连接类型 - 也不是所有平台 - 都支持基于事务范围的事务,即使它们支持:由于与多个系统对话时的范围问题,它们可能无法预测,需要像 DTC 这样的东西。
相反,我强烈建议:不要使用事务范围(除非您有充分的理由)。相反,更喜欢更简单和更广泛支持的 ADO.NET 事务模型:
- 在连接上使用
BeginTransaction
(或异步等效项)以(不出所料)开始事务
- 在代码中携带该事务实例
- 在每个命令上设置事务 属性(我一直不明白为什么这是必要的,因为它是通过连接隐含的,但是:它是)
- 确保在最后提交或中止事务,最好使用
try
/catch
/finally
以便它在成功和失败时都正确发生
各位!
我在使用 TransactionScope 时遇到问题。我希望我的网络方法是事务性的。如果发生任何异常,我希望回滚所有数据库更改。否则,提交。请参阅下面的错误消息。
System.ApplicationException: Error in someClass :: Method public returnType methodName(parameterType parameter) :
System.ApplicationException: Error in someClass :: Method private string someMethod() :
System.Data.Odbc.OdbcException (0x80131937):
ERROR [08003] [Sybase][ODBC Driver]Connection not open
at System.Data.Odbc.OdbcConnection.Open_EnlistTransaction(Transaction transaction)
at System.Data.Odbc.OdbcConnectionOpen.EnlistTransaction(Transaction transaction)
at System.Data.Odbc.OdbcConnection.EnlistTransaction(Transaction transaction)
at System.Data.Odbc.OdbcConnection.Open()
at someNameSpace.someMethod() in c:\somePath\someClass.cs:line 35
以下是我的代码摘录。我做错了什么?
[WebMethod]
public returnType methodName(parameterType parameter)
{
using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
try
{
var someValue = someMethod();
:
:
:
transactionScope.Complete();
return response;
}
catch (Exception ex)
{
return ErrorMessages(ex);
}
}
}
private string someMethod()
{
var commandText = "...some valid SQL expression...";
var commandType = CommandType.Text;
try
{
using (var odbcConnection = new OdbcConnection(DefaultDbConnection.ToString()))
{
using (var odbcCommand = new OdbcCommand(commandText, odbcConnection))
{
odbcConnection.Open(); // Exception is thrown here!
odbcCommand.CommandType = commandType;
using (var reader = odbcCommand.ExecuteReader())
{
reader.Read();
return reader.GetString(0);
}
}
}
}
catch (Exception ex)
{
throw new ApplicationException("Error in someMethod.", ex);
}
}
在此先感谢您的帮助!
最终,并非所有连接类型 - 也不是所有平台 - 都支持基于事务范围的事务,即使它们支持:由于与多个系统对话时的范围问题,它们可能无法预测,需要像 DTC 这样的东西。
相反,我强烈建议:不要使用事务范围(除非您有充分的理由)。相反,更喜欢更简单和更广泛支持的 ADO.NET 事务模型:
- 在连接上使用
BeginTransaction
(或异步等效项)以(不出所料)开始事务 - 在代码中携带该事务实例
- 在每个命令上设置事务 属性(我一直不明白为什么这是必要的,因为它是通过连接隐含的,但是:它是)
- 确保在最后提交或中止事务,最好使用
try
/catch
/finally
以便它在成功和失败时都正确发生