应该在存储过程之外还是在内部指定事务?

tpo*_*wer 15 .net sql sql-server stored-procedures isolation

我们可以在事务中包装对存储过程的调用,并指定隔离级别.

或者我们可以将事务放在存储过程中指定一个隔离级别.

哪个更好?

Tor*_*gen 7

你应该采用一致的方法.请注意,回滚存储过程中的事务将回滚任何嵌套事务范围,包括任何外部范围.

我建议你把你的交易保留在程序之外.这样,你保持完全控制.


Joh*_*som 6

在我看来,存储过程内部是最合适的位置.

良好事务设计的基本规则之一是尽可能缩短事务的生命周期,因此提交应在事务逻辑完成后立即进行.控制存储过程之外的事务将导致不必要地延长事务的寿命.

您还应该考虑在过程中定义事务还可以使代码更加清晰.否则,如果另一个编码器需要修改给定的存储过程,则它们必须依赖于调用者确实将事务包装在事务中的事实.在程序中包含事务明确定义了您的事务处理.

  • 对于那些决定得分为-1的人来说,提供你的推理是礼貌的. (3认同)

Sea*_*ean 5

正如FYI一样,Oracle不支持嵌套事务,如果您在外层开始事务然后调用一系列存储过程,那么发出提交的任何存储过程将提交到目前为止的整个事务,而不仅仅是它煽动的交易.因此,当使用C#等语言调用时,您必须在stored-proc之外管理事务

只是想你可能会感兴趣,为了比较.


MrT*_*lly 2

这取决于业务逻辑,如果 SP 是原子的,它应该实现自己的事务。如果您不这样做,您将来将面临出现错误代码而不创建包装事务的风险。所以在回答你的问题时,我认为交易应该进入 SP 内部。

当然,没有什么可以阻止您同时执行这两项操作,原子 SP 实现自己的事务,并且在该范围之外,其他更广泛的事务可能已经存在。

一般来说,当在 SP 中使用事务创建时,您可能已经在事务范围内,在执行提交/回滚时必须为此实例编写代码。