在事务中包装每个sql / stored proc调用有什么好处?

时间:2010-05-26 16:26:57

标签: c# sql-server ado.net transactions

以下代码执行一个存储过程。存储过程中只有一个命令。包装事务中的所有内容是否有任何好处,即使它只有一个SQL语句(或只有一个sql语句的一个存储过程)?

在下面的示例代码中,如果删除失败,则失败。没有其他东西可以回滚(似乎)。那么为什么一切都包含在交易中呢?

using (ITransactionManager transMan = repository.TransactionManager())
using (IController controller = repository.Controller())
{
    transMan.BeginTransaction();
    try
    {
        //DELETE FROM myTable where Id=@id
        controller.Delete(id);
        transMan.CommitTransaction();
    }
    catch
    {
        transMan.RollbackTransaction();
        throw;
    }
}

3 个答案:

答案 0 :(得分:5)

通过将其包装在事务中(因为将使用轻量级事务),您实际上并没有太多损失,如果您向业务层添加更多逻辑,那么您已经有了工作事务管理。

此代码也适用于嵌套事务,而如果您没有在此级别使用事务,则可能会失去一些好处,具体取决于代码和存储过程的结构。

另一种可能性是存储过程可能会更改并具有多个语句 - 同样,您仍然可以使用有效的事务管理。

我会保留它。

答案 1 :(得分:2)

从代码处查看,没有明显的交易原因。它不会伤害任何东西,但它可能引起混乱,让人想知道它为什么会存在。

但是,如果您的注释掉的代码代表存储过程,则该过程可能需要多个操作,如果失败发生在某个点之后,则可能会有回滚操作。如果是这样,交易可能有一个很好的理由。

答案 2 :(得分:2)

即使您没有显式启动事务,所有数据库查询都在隐式事务中运行。看看this advise from the NHProf homepage。它很好地描述了为什么你几乎总是应该使用显式事务。