如何以编程方式为弹簧中的事务设置回滚点?

时间:2014-04-03 11:52:43

标签: java sql spring transactions spring-transactions

如何在Spring中指定事务的回滚点?

假设以下场景,我必须在db中执行一个非常长的插入,这需要相当长的时间(几分钟)。此插入操作包含在事务中,该事务确保如果发生问题,则中止事务并将数据库恢复到事务开始之前的状态。

但是,此解决方案会影响应用程序的性能,因为在执行长事务时,其他事务无法访问数据库。我通过在执行相同操作的几个较小事务中拆分大事务来解决此问题。但是,如果其中一个小事务失败,则数据库将回滚到此最后一个事务之前的状态。不幸的是,这会使数据库处于不正确的状态。我希望如果在任何这些较小的事务中发生错误,数据库将回滚到第一个小事务之前的状态(即完全相同的状态,如果此操作由单个事务执行,它将回滚)。

您是否有任何建议如何使用Spring事务实现此目的?

2 个答案:

答案 0 :(得分:0)

你应该关注http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/transaction/TransactionStatus.html。 它具有所需的功能: - 创建保存点 - 发布保存点 - 回滚到保存点

当然,您的事务管理器(以及底层JDBC驱动程序和DB)应该支持该功能。

答案 1 :(得分:0)

如果您可以使用相同的主键序列来登台表和生产表,那么您应该批量将数据从stg移动到prod。当一个小事务失败时,您可以使用登台表中的键从生产表中删除。这样您就可以将生产表恢复到原始状态