那么下一个问题是如何在这个 TransactionScope 中创建和使用连接。我听说即使是对同一个数据库使用多个连接也会迫使 TransactionScope 认为这是一个分布式事务(涉及一些昂贵的 DTC 工作)。这样吗?还是像我在其他地方看到的那样,使用相同的连接字符串(这将有助于连接池)就可以了呢?更实际的问题是...
- 在父级和子级中创建单独的连接(尽管具有相同的连接字符串)
- 在父级中创建一个连接并将其作为参数传递(对我来说似乎很笨拙)
- 还有别的方法吗...?
更新:
虽然看起来我可以使用我平常使用的.NET3.5+和SQL Server 2008+,但该项目的另一部分将使用Oracle(10g),因此我最好练习一种可以在项目中始终使用的技术。
所以我只需将连接传递给子方法即可。
选项1代码示例:
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.Connection.Open();
cmd.CommandType = CommandType.StoredProcedure;
try
{
//create & add parameters to command
//save parent object to DB
cmd.ExecuteNonQuery();
if ((int)cmd.Parameters["@Result"].Value != 0)
{
//not ok
//rollback transaction
ts.Dispose();
return false;
}
else //enquiry saved OK
{
if (update)
{
enquiryID = (int)cmd.Parameters["@EnquiryID"].Value;
}
//Save Vehicles (child objects)
if (SaveVehiclesToEPE())
{
ts.Complete();
return true;
}
else
{
ts.Dispose();
return false;
}
}
}
catch (Exception ex)
{
//log error
ts.Dispose();
throw;
}
}
}
}