【问题标题】:Spring and Postgres transaction ErrorSpring 和 Postgres 事务错误
【发布时间】:2017-02-20 08:49:05
【问题描述】:

目前,我正在使用 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 使用什么。

【问题讨论】:

    标签: java spring hibernate jpa postgresql-9.5


    【解决方案1】:

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

    此用户集合不是从事务内部初始化的,因此实体很可能被分离,因为您使用的是容器管理的事务。

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

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

    【讨论】:

    • 谢谢,但我通过检查更多内容并阅读此错误消息解决了我的问题,我得出结论,保存错误不在getEm().update(singleUser);
    • 抱歉现有评论。谢谢,但我通过检查更多内容并阅读上面的此错误消息解决了我的问题。这意味着上一个事务被中止下一个不能继续保存错误不在getEm().update(singleUser);而在integrationService.manangePassCodes(org,userListToStore.size());一段代码参考链接1-postgresql.org/message-id/25677724.post@talk.nabble.com参考链接2-postgresql.org/docs/9.4/static/errcodes-appendix.html
    【解决方案2】:

    感谢 Speedy 的帮助,通过检查更多内容并阅读上面的此错误消息,我解决了我的问题。我从单个事务中调用了许多事务,这意味着在我的情况下,由于先前的事务错误,下一个被中止因为它在数据库上有写锁。在您整理前一笔交易之前,您当前的交易不会被保存。 以前的交易有愚蠢的错误 getEm().update(singleUser); 当前交易没有问题 integrationService.manangePassCodes(org,userListToStore.size‌()); 一段代码 由于两者都属于不同的服务,但我已经注释了 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = { Throwable.class }) 传播 = 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

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 2010-11-20
      • 2015-10-04
      • 2016-09-17
      • 2021-06-19
      • 2013-01-29
      • 2011-01-10
      • 2012-12-10
      相关资源
      最近更新 更多