假设我们有一个DAL方法
public void BuyProduct(int productId, int quantity, int buyerId);在该方法中,我们需要调用2个存储过程:
tblOrders_CreateNewOrder
创建2个SqlCommands (每个存储过程一个)并使用单个SqlConnection执行这些命令是一个好做法吗?
或
为每个SqlConnection创建一个单独的SqlCommand更好吗?
因此,基本上我是在问:是一个好的实践吗?在单个DAL方法中为多个(2-4) SqlCommands重用单个DAL是否是一个很好的实践(显然,在整个DAL中重用SqlConnection是愚蠢的)?
PS -请不要问我为什么我不能把两个存储过程合并成一个。我的回答是-分离关注点。
发布于 2010-07-15 04:16:29
真正的问题不是连接,而是交易。当一个逻辑操作涉及多个DAL物理操作时,通常它们必须是一个超越的一部分。除非核可是可选的..。如果事务跨越多个连接,则必须将其提升为分布式事务,从而导致灾难性后果。因此,在设计DAL时,总是将事务与连接关联起来。这影响了DAL的设计,因为通常的结果是,连接和事务对象必须作为单独的参数或聚合它们的“上下文”对象明确地传递给DAL方法。
发布于 2010-07-15 04:33:54
是的,重用单个SqlConnection用于多个SqlCommands (在一个方法中)是一个很好的实践。正如我在您的例子中所理解的,您还需要像这样使用SqlTransaction:
public void SomeDALMethod(string connectionString)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var transaction = connection.BeginTransaction();
var command1 = new SqlCommand("tblOrders_CreateNewOrder", connection, transaction)
{
CommandType = CommandType.StoredProcedure
};
var command2 = new SqlCommand("tblProducts_RecalculateStock", connection, transaction)
{
CommandType = CommandType.StoredProcedure
};
try
{
command1.ExecuteNonQuery();
command2.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex)
{
// Commit failed
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// Rollback failed
}
}
}
}它允许在第二个sp失败时回滚第一个存储过程的执行。
发布于 2010-07-15 04:05:29
默认情况下,.NET创建一个池SqlConnection。因此,创建新连接(只要它们都使用相同的连接字符串)不会造成开销,直到池完全耗尽。
https://stackoverflow.com/questions/3252355
复制相似问题