【发布时间】:2018-05-22 14:04:27
【问题描述】:
我有 4 个存储过程,我们将它们命名为 spA、spB、spC 和 spD。
每个存储过程都有一个启动事务、提交和回滚。
spA 当前是父 存储过程(SP),在其中,我按各自的顺序调用 spB、spC、spD。显然,因为所有的 SP 都有提交,所以当 spC 失败时,在 spB 中执行的 DML 操作不会恢复,因为它们已经提交,并且当 spD 失败时 spB 和 spC 中的操作不会回滚。
我在 spB、spC 和 spD 中提交的原因是,稍后我可能会直接使用这些 SP 中的任何一个来执行与 SP 相关的操作。
目前,我计划使用输入位标志来决定是否提交事务。在 MS SQL 中,有一个检查 @@transcount 的选项,但是,我在 MySQL 中找不到类似的东西。
我想知道是否有更好的方法来处理这种情况。
【问题讨论】:
-
我的建议是不要将提交放在存储过程中。如果一切都按预期完成,则在 sp 之后提交。我真的不明白你这样做的原因,但我认为这样做的成本超过了收益。
-
正如我提到的,我计划稍后单独使用父 SP 中的各个 SP。假设 spB、spC、spD 在表 B、C 和 D 中插入数据。这样,spA 会同时在所有三个表(B、C 和 D)中插入数据。但是,稍后我可能只想在表 B、C 或 D 中插入数据。为此,我只需调用相应的 spB、spC 或 spD。因此,我也需要这些 SP 中的事务(启动、提交和回滚)。它解释了我为什么这样做吗?
-
只管理一个事务更容易(MySQL本身没有嵌套的工具)。当您以后使用它们时,您总是可以将 B、C 和 D 调用包装在事务中。
-
我发现的一件事是我不能做我计划做的事情,因为在 MySQL 中每次遇到新的启动事务时,新启动事务之前的所有 DML 查询都被隐式提交。所以我将不得不坚持使用包装技术。如果有更方便的方式,我会喜欢的。
标签: mysql database stored-procedures transactions rdbms