【问题标题】:Nested transaction rollback between two savepoints?两个保存点之间的嵌套事务回滚?
【发布时间】:2013-02-06 11:16:08
【问题描述】:

对于三种 SQL 类型(MySql、SQLite 和 PostgreSQL),我希望/需要以相同方式处理保存点。

现在我的应用程序可以在一个大事务中更改数据库中的不同条目,并且需要一些嵌套事务来实现程序的特殊行为。

所以问题是,如果我创建类似的东西:

BEGIN TRANSACTION;
--random insert/update statements
SET SAVEPOINT sp1;
--more random inserts/updates
SET SAVEPOINT sp2;
--inserts n stuff

(是的,语法可能不正确,这只是一个例子)

所以我想知道是否可以在sp1 和sp2 两个保存点之间进行回滚而不回滚sp2 之后的插入/更新?

【问题讨论】:

  • 不确定你在问什么。你想ROLLBACK TO SAVEPOINT sp1; 吗?因为如果是这样,在 PostgreSQL 上,你就是这样做的。您是否在问是否可以回滚 SP1 和 SP2 之间的更改而不回滚以后的更改?如果是这样,不,你不能用子事务来做到这一点,你需要自治事务,这是完全不同的事情。请澄清,并在您进行编辑后在此处发表评论。
  • 是的,我只想回滚这两个保存点之间的更改。

标签: mysql sqlite postgresql transactions


【解决方案1】:

保存点不会做你想做的事。当您回滚到某个保存点时,该保存点之后的所有内容都会回滚,无论是否创建了后来的保存点。

将保存点想象为“堆栈”。你不能从堆栈的中间拉出一些东西,你必须把所有东西都移到你想要的层。

您可能正在寻找自主交易。您要使用的数据库都不支持它们。在 PostgreSQL 中,您可以使用 dblink 模块与数据库建立新连接并使用它来解决此问题;见http://www.postgresql.org/docs/current/static/dblink.html。我不知道 MySQL 或 SQLite 提供了哪些解决方案,但 Google 会在您知道您要查找的术语后提供帮助。

如果可能,我建议您找到解决此应用程序设计要求的方法。让您的应用程序使用两个数据库连接和两个事务来执行您需要的操作,并根据需要协调两者。

【讨论】:

    猜你喜欢
    • 2020-02-22
    • 2013-12-10
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多