2012-07-24 77 views
1

在对数据库执行一堆查询之后,我从Spring Transaction(标有@Transactional的Spring服务)调用存储过程。如何使存储过程中的查询知道Spring事务?

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

为了使存储过程回滚的查询时的异常是由Java代码引发(或DB在javacode所做的修改轧制因为在存储过程中引发的异常的背面) ,我已经将mysql服务器的autocommit变量设置为false。 这解决了我的问题的一部分。我现在拥有所有的DB事务处理代码。我的问题是存储过程的查询不知道在java代码中所做的修改(对数据库)。即来自存储过程的选择读取Spring事务开始之前DB中的值。

我的问题是(标题中指出的)如何使存储过程中的查询意识到在调用存储过程之前(来自该事务)在Spring事务中对DB进行的修改?

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

感谢

+0

您是否使用START TRANSACTION/COMMIT ROLLBAcK显式管理您的存储过程的事务? – gkamal 2012-07-24 10:20:50

+0

不,我已经将autocommit设置为false,以便让Spring提交或回滚存储过程中的查询。这样可以回滚Spring和Stored Procedure中的查询。 – Romeo 2012-07-24 10:26:25

回答

0

原来我需要调用平齐的实体管理器,以便同步持久化上下文的基础数据库。我还删除了SP的任何交易管理指令,并按预期工作;存储过程中的查询现在是Spring管理的事务的一部分。