gpt4 book ai didi

sql-server - 使用 TransactionScope 执行包含 BEGIN TRANS - COMMIT TRANS 的多个 SP

转载 作者:行者123 更新时间:2023-12-03 16:47:01 26 4
gpt4 key购买 nike

当 BEGIN TRANS - COMMIT TRANS 在一个 SP 中完成并且多个 SP 在 TransactionScope 中执行并且在完成范围之前抛出错误时会发生什么。

所以伪代码如下

//Using TransactionScope() {
// executing SP1
// executing SP2
// executing SP3
// throw new Exception();
//}

SP2 包含如下代码。

// BEGIN TRANS
// Update Statement1
// Update Statement2
// Update Statement3
// COMMIT TRANS

如果我们假设事务在 SP2 中提交会发生什么?

  1. 一切都回滚
  2. SP2 中的 3 个语句被提交。其他一切都会回滚?

我不知道这是否重要,但以防万一,所有三个 SP 都使用一个连接对象执行,并且连接在两个 ExecuteNonQuery 语句之间关闭并再次打开。

最佳答案

只有一个事务,总是,由最外层事务作用域启动的最外层事务。所有其他内部事务范围和 T-SQL 代码中出现在最外层事务范围下的所有其他 BEGIN TRANSACTION 只不过是 @@TRANCOUNT 的美化增量而已。所有这些 COMMITS 只不过是相同的递减。只有最后一次 COMMIT 才是重要的,直到那时事务还没有提交。

因此在您的示例中,SP2 没有提交任何内容。它所做的一切都是将@@TRANCOUNT 递增到 2,然后又递减回 1。事务仍然处于事件状态,当 C# 代码抛出事务时,事务将回滚。

作为旁注,请参阅 Exception handling and nested transactions有关如何编写良好的异常安全存储过程的模板。

关于sql-server - 使用 TransactionScope 执行包含 BEGIN TRANS - COMMIT TRANS 的多个 SP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10816457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com