Spring和Postgres事务错误

时间:2017-02-20 08:49:05

标签: java spring hibernate jpa postgresql-9.5

目前,我正在使用Spring 4.0.6和Postgresql 9.5。我正在呼叫一个serviceClass1到另一个serviceClass2并获得以下事务的例外:

serviceClass1.class

`@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor= { Throwable.class })
public Map<String, Object> storeUsersList(Map<String, Object> mapOfParams) throws Exception {
    Map<String, Object> returnMap = new HashMap<String, Object>();
if (userListToStore != null && !userListToStore.isEmpty()) {                
integrationService.manangePassCodes(org,userListToStore.size());
                for (Users singleUser : userListToStore) {
                    try {
                        getEm().update(singleUser);`

serviceClass2.class

@Override
@Transactional(readOnly=false,propagation=Propagation.REQUIRED
     ,rollbackFor{Throwable.class})
public void manangePassCodes(Organizations org,int userToRegisterCount)throws Exception{
//some Logic

这里我在这个地方得到了例外 - getEm().update(singleUser);

  

异常SQL状态[25P02];错误代码[0];无法提取   结果集

我刚刚读到有关Postgres事务的这个错误,但无法获得我应该用于Hibernate的内容。

2 个答案:

答案 0 :(得分:1)

不是100%确定是否是这种情况,但在storeUsersList方法中,您似乎正在重用已存在于实例变量userListToStore中的现有用户集合。

这个用户集合未从事务内部初始化,因此实体最有可能被分离,因为您正在使用容器管理的事务。

在我看来,你应该在执行更新之前合并每个实体,以便持久化上下文知道它们:

for (Users singleUser : userListToStore) {
      try {
        getEm().merge(singleUser);
        getEm().update(singleUser);

答案 1 :(得分:1)

感谢Speedy的帮助,我通过检查更多内容并阅读上面的错误消息解决了我的问题。我从单个事务中调用了很多事务,这意味着在我的情况下由于之前的事务错误而中止了因为它在DB上有写锁定。并且在您整理上一个交易之前,您的当前交易不会被保存。 以前的交易有愚蠢的错误 getEm().update(singleUser); 当前交易没有错误 integrationService.manangePassCodes(org,userListToStore.size‌());  一段代码 由于两者都属于不同的服务,但我已经注明了 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = { Throwable.class }) propagation = Propagation.REQUIRED表示它将支持当前事务,如果不存在则创建一个新事务。 所以它给了我错误25P02 - 交易中止。

参考链接1 - postgresql.org/message-id/25677724.post@talk.nabble.com

参考链接2 - postgresql.org/docs/9.4/static/errcodes-appendix.htm

参考链接3 - https://www.postgresql.org/message-id/8829.1173816732%40sss.pgh.pa.us