spring boot,spring data jpa同一事务内修改不可见

目前我遇到这么个问题,在同一事务内,先saveAndFlush()了一条数据,在同一方法内,事务最终提交前,然后立刻查询此数据,但是并查不到。但是据我多年经验,同一事务内,尽管没提交,但是其修改在同一的当前的事务内应该是可见的才对呀。

困惑很久了,什么各种事务隔离性都试了,况且所谓事务隔离性,都是指不同事务间,我这是同一事务内都不可见,求求大侠们帮忙看看, 实在找不到解决思路了。谢谢大家,哎,没有C币,只能乞求大家了。

详细的代码和过程,我已经发在stackoverflow了,链接如下:
https://stackoverflow.com/questions/53449779/the-modifying-can-not-be-visible-in-the-same-transaction-in-spring-data-jpa-why/53455542#53455542

2个回答

同一事物内是可见的,你这个问题可能不是事务导致的,有种可能是你提交的数据库是写数据库,你读的数据库是读库,在你读的时候读库和写库还没有同步,也会出现明明提交了但是还是读不到的问题。你具体在看下吧。

zwllxs
zwllxs 可是我就一个库哦,没有读写分离,我觉得肯定哪里配置或依赖有啥问题,实在找不出来了
一年多之前 回复

我解决了, 正是事务配置问题。
经过琢磨研究,我把事务配置修改成如下解决了:


package com.hl.core.conf;

import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.TransactionInterceptor;

import java.util.Properties;

/**
* @author zhangweilin
* @date 2018/11/24 21:05 
* @Description:  全局声明式事务(此配置解决事务内修改不可见问题 , 此坑消耗了我整整两天一夜研究琢磨,)
*/
//@Component
@Configuration
public class TxConfig2 {
    @Autowired
    private PlatformTransactionManager transactionManager;

    @Bean(name = "txAdvice")
    public TransactionInterceptor getAdvisor() throws Exception {
        System.out.println("transactionManager = " + transactionManager);
        Properties properties = new Properties();
        properties.setProperty("init*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("add*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("insert*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("create*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("persist*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("update*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("modify*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("merge*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("bind*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("del*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("drop*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("remove*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("reset*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("cancel*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("login*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("save*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("update*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("delete*", "PROPAGATION_REQUIRED,-Exception");
        properties.setProperty("*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        TransactionInterceptor tsi = new TransactionInterceptor(transactionManager, properties);
        return tsi;
    }
    @Bean
    public BeanNameAutoProxyCreator txProxy() {
        BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
        creator.setInterceptorNames("txAdvice");
        creator.setBeanNames("*Service","*Dao");
        creator.setProxyTargetClass(true);
        return creator;
    }
}

这个坑,踩了我很久,此解决方案,已同步更新到stackoverflow了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问