我们正在使用C#
当连接被选择为死锁受害者时,
根据MSDN的说法:
我们正在使用.Net 4.5、SQL Server 2008 R2、Visual Studio 2012
这是我们数据库访问框架代码的简化版本:
SqlCommand.ExecuteReader()
在事务中发出SQL Server存储过程和SQL请求。当连接被选择为死锁受害者时,
ExecuteReader()
对于某些命令不会抛出带有1205死锁代码的SqlException
,但对于其他命令则会抛出。根据MSDN的说法:
考虑到我们使用的是封装在自己的数据库请求框架中的如果事务死锁,则可能直到调用Read方法才会抛出异常。
SqlCommand
对象,是否有一种方法可以始终保证在发生死锁时抛出异常?我们正在使用.Net 4.5、SQL Server 2008 R2、Visual Studio 2012
这是我们数据库访问框架代码的简化版本:
SqlDataReader DoWork( string sql ) {
...
cmd = new SqlCommand( sql );
SqlDataReader rdr = null;
try {
rdr = cmd.ExecuteReader( CommandBehavior.Default );
} catch (SqlException sqle) {
// Log the error, throw a custom exception, etc.
// if (sqle.ErrorCode == 1205) ...
...
if (rdr != null) {
rdr.Close();
rdr = null;
}
}
// All is well, so just return to caller to consume the result set
return rdr;
}
...
main() {
...
SqlDataReader result = DoWork( "select ...";
if (result.HasRows) { // Check there is data to read...
while (result.Read()) {
...
}
result.Close();
...
}