以下代码执行一个存储过程。存储过程中只有一个命令。包装事务中的所有内容是否有任何好处,即使它只有一个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;
}
}
答案 0 :(得分:5)
通过将其包装在事务中(因为将使用轻量级事务),您实际上并没有太多损失,如果您向业务层添加更多逻辑,那么您已经有了工作事务管理。
此代码也适用于嵌套事务,而如果您没有在此级别使用事务,则可能会失去一些好处,具体取决于代码和存储过程的结构。
另一种可能性是存储过程可能会更改并具有多个语句 - 同样,您仍然可以使用有效的事务管理。
我会保留它。
答案 1 :(得分:2)
从代码处查看,没有明显的交易原因。它不会伤害任何东西,但它可能引起混乱,让人想知道它为什么会存在。
但是,如果您的注释掉的代码代表存储过程,则该过程可能需要多个操作,如果失败发生在某个点之后,则可能会有回滚操作。如果是这样,交易可能有一个很好的理由。
答案 2 :(得分:2)
即使您没有显式启动事务,所有数据库查询都在隐式事务中运行。看看this advise from the NHProf homepage。它很好地描述了为什么你几乎总是应该使用显式事务。