【发布时间】:2013-05-31 10:21:07
【问题描述】:
我想执行单个 SELECT 查询,然后执行一系列 UPDATE 查询(都在同一张表上); UPDATE 是在一个单独的方法中实现的,该方法被重复调用。如果其中一个 UPDATE 查询失败,我希望它们全部失败/回滚 - 所以我想将它们加入事务。但是,我不确定应该在哪里打开 SqlConnection 以避免任何问题。我当前的实现如下所示:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// execute a single SELECT here
using (TransactionScope scope = new TransactionScope())
{
for (int i=0; i<...; i++)
{
Update(); // UPDATE query
}
scope.Complete();
}
}
Update()
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// execute a single UPDATE here
}
}
在所有情况下都应该按预期工作吗?
SELECT之前打开一个连接,然后用Update()方法打开一个新连接可以吗?由于连接池,SELECT 和 UPDATE 查询将使用相同的连接(connectionString 相同),但事务中只会加入 UPDATE 查询,对吗?但是如果在Update() 中使用不同的连接会发生什么?所有 UPDATE 查询是否仍会按预期加入事务并自动执行?
如果我理解正确,在关闭第一个连接后(在执行 SELECT 的 using 块之后)创建事务范围仍然有效,但会降低性能,因为连接将被关闭并需要重新打开, 正确的?或者实际上是为事务范围创建了一个新连接,并且每次调用Update() 时都会打开和关闭?
【问题讨论】:
标签: c# .net sql transactionscope