2

在数据库上执行了一堆查询之后,我从 Spring Transaction(一个标有 @Transactional 的 Spring Service)调用了一个存储过程。

entityManager.createNativeQuery("call stored_procedure()");
query.executeUpdate();

为了在java代码抛出异常时使存储过程的查询回滚(或者由于存储过程中抛出异常而回滚javacode中对数据库的修改),我设置了自动提交mysql服务器的变量为false。这解决了我的部分问题。我现在拥有数据库事务的所有代码。我的问题是存储过程的查询不知道在 java 代码中所做的修改(对 DB)。即存储过程中的选择读取在 Spring 事务开始之前数据库中的值。

我的问题是(标题中所述的问题)如何使存储过程中的查询知道在调用存储过程(从该事务)之前对 Spring Transaction 中的数据库所做的修改?

不幸的是,现在将数据库设置为脏读不是我的选择。是否可以获取 Spring 在 mysql 上打开的事务的 ID,并在该事务中运行存储过程的查询?

谢谢

4

1 回答 1

2

结果我需要在实体管理器上调用flush,以便将持久性上下文同步到底层数据库。我还从 SP 中删除了任何事务管理指令,它按预期工作;存储过程中的查询现在是 Spring 管理的事务的一部分。

于 2012-07-24T13:03:21.713 回答