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