【发布时间】:2015-11-23 14:22:17
【问题描述】:
我们正在使用 C# 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();
...
}
【问题讨论】:
-
您能否出示您的代码以便我们提供帮助
-
或者,选项 2 -- 摆脱死锁。
-
@Hogan 这是这个死锁的答案,但有时会出现其他死锁。在您能够解决新死锁情况的根本原因之前,这是没有帮助的。
-
@Hogan 或者更进一步,为什么在任何代码中都有任何错误处理?为什么不直接写防错代码呢?
标签: c# .net sql-server