我想从nservicebus处理程序调用我的ms sql存储过程,我想知道我是否仍然需要使用类似这样的东西。
创建过程dbo.proc_fd_SomeEntitySyncRawWithStage
AS BEGIN
开始尝试
开始事务
-- Batch of inserts and updates that I want to keep transactional提交事务;
结束尝试开始捕捉
回滚事务;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);结束捕捉;结束
我真的需要所有这些尝试开始转换...捕获回滚..或将XACT_ABORT设置为打开...如果消息处理程序中出现任何sql异常,回滚我的事务的东西或NServiceBus会回滚它吗?
附注:记住:
如果批处理中出现运行时语句错误(如违反约束),则数据库引擎中的默认行为是仅回滚生成错误的语句
和
如果SET XACT_ABORT处于OFF状态,则在某些情况下,仅回滚引发错误的Transact-SQL语句,事务将继续处理。
发布于 2015-02-02 17:54:50
通常,你应该总是将你的过程调用包装在一个事务中,你会使用ORM还是ADO.NET。
var ts = myConnection.BeginTransaction();然后在try-catch块中调用您的过程。
进一步取决于您的逻辑。如果你的过程可能因为某些逻辑而失败,你需要有一个返回码,并基于此抛出一个异常。如果您的过程因SQL异常而失败,try-catch块将处理它。
在catch块中,您需要回滚事务。
如果在catch块中重新抛出异常,消息将由FLR重试,如果已配置,则由SLR重试。通常,当数据库中有死锁时,这会很有帮助,FLR通常会处理这个问题。
https://stackoverflow.com/questions/28062420
复制相似问题