我希望执行一条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()时都会为事务范围创建一个新连接,并在其中打开和关闭?