我有以下使用SqlTransaction的代码.我已经在catch中调用dispose并最终阻止了..但是在调用Dispose()之前我还没有检查它是否已经被释放.在调用Dispose()之前,我们如何检查SqlTransaction是否已被释放?
我已经引用了MSDN:SqlTransaction.Dispose方法.但这并不包括我的问题.
另请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.dispose(v=vs.100).aspx
注意:我已经知道它TransactionScope有优势了SqlTransaction.但我试图了解SqlTransaction的配置.
码
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = null;
try
{
transaction = connection.BeginTransaction();
sessionID = GetSessionIDForAssociate(connection, empID, transaction);
//Other code
//Commit
transaction.Commit();
}
catch
{
//Rollback
if (transaction != null)
{
transaction.Rollback();
transaction.Dispose();
}
//Throw exception
throw;
}
finally
{
if (transaction != null)
{
transaction.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
在调用Dispose()之前,我们如何检查SqlTransaction是否已被释放?
你不必.两次调用处置不会对您造成任何问题.
如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.除了Dispose之外的实例方法可以在已经处置资源时抛出ObjectDisposedException.
但是,如果您只想调用Dispose一次,那么您可以使用布尔标志来设置事务处理时间,也可以将其设置为null.或者在catch块中删除对dispose的调用,因为finally将始终调用块.
由于SqlTransaction实现了IDisposable,如果将它与using block一起使用它会更好.就像是:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
sessionID = GetSessionIDForAssociate(connection, empID, transaction);
//Other code
//Commit
transaction.Commit();
}
catch
{
//Rollback
if (transaction != null)
{
transaction.Rollback();
}
//Throw exception
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于使用块的作用类似于try/finally块,因此它将确保在事务完成时处理事务(即使发生异常).所以你不必手动打电话Dispose.
| 归档时间: |
|
| 查看次数: |
10110 次 |
| 最近记录: |