两个保存点之间的嵌套事务回滚?

时间:2013-02-06 11:16:08

标签: mysql sqlite postgresql transactions

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

保存点无法满足您的需求。当您回滚到保存点时,无论是否创建了以后的保存点,都会回滚该保存点之后的所有内容。

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

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

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