作为报告模块的一部分,我正在执行几个长时间运行的 SQL 查询。这些查询是在运行时动态构建的。根据用户的输入,它们可能是单语句或多语句,具有一个或多个参数并在一个或多个数据库表上进行操作——换句话说,它们的形式不能轻易预料。
目前,我只是在普通SqlConnection
的 IE上执行这些语句
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
因为这些查询(实际上是批量查询)可能需要一段时间才能执行,所以我担心表上的锁会阻碍其他用户的读/写。如果这些报告的数据在批处理执行期间发生变化,这不是问题;报表查询不应优先于这些表上的其他操作,也不应锁定它们。
对于大多数涉及修改数据的长时间运行/多语句操作,我会使用事务。此处的区别在于这些报表查询不会修改任何数据。SqlTransaction
为了控制它们的隔离级别,我是否正确包装这些报告查询?
IE:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
这会达到我想要的结果吗?即使没有修改任何数据,提交事务是否正确?还有另一种方法吗?