我想执行一个 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()
调用都会打开和关闭?