spring事务问题,监听器直接调用的代码没有事务

sprouting 发布于 2017/06/23 17:24
阅读 118
收藏 2

最近接手一个接口的开发工作,代码都写的差不多了,测试的时候忽然发现事务没有生效,先说下项目吧,我们是A公司,另外一个B公司,还有一个C公司,C公司开发的手机端程序,会调用我们公司的接口,做一系列逻辑处理,可以看成C公司就是做页面展示,我们公司做后台逻辑实现,B公司的作用是为了安全,C公司的请求会先到B公司,B公司会直接调用我们公司的代码。

具体的实现是B公司在我们公司的web,xml中加了监听器,请求过来后监听器调用约定好的路径下的代码,感觉B公司相当于控制层

因为通过监听器直接调用的代码,我们启动应用后spring管理不到,spring的注入是通过

public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.context = applicationContext;
    }

    /**
     * 根据bean的name来获取bean
     *
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

    /**
     * 获取spring上下文
     *
     * @return
     */
    public static ApplicationContext getContext() {
        return context;
    }

}

service 的代码还是通过下面的方式获取的

if (testService == null) {
    testService = (TestService ) SpringContextUtil.getBean("testService ");
    if (testService == null) {
        testService = new TestServiceImpl();
    }
}

这样才获取到spring中注入的bean,直接用

@Autowired

用无法获取到bean。到这一步,所有的都还正常,可以通过这种方式获取到bean,也可以执行增删改查,可随即发现事务是失效的。

我们的项目是mvc结构,在之前项目基础上修改的。用的ssm,实际上springmvc在这里并没有作用,最终要返回给C公司的是json数据,

String msg = "{\"code\":\"1\",\n" +
        "\"message\":\"参数不完整,请确认\",\n" +
        "\"result\":false}";

多数据源配置。

因为B公司调用的我们的代码这里最后是要返回字符串,之前spring没有抛出运行异常应该是不会其作用的,但是修改了下,让抛出运行异常也不会回滚。然后用

SqlSessionFactory sqlSessionFactory = SpringContextUtil.getContext().getBean(SqlSessionFactory.class);
SqlSession sqlSession = sqlSessionFactory.openSession(false);
sqlSession.rollback(); //回滚事务
sqlSession.commit();

这种方式,手工来弄事务,发现这个事务压根就没开启,为什么会没开启呢?

如果打开事务后

sqlSession.getConnection().setSavepoint(); //回滚点

执行上面这段代码会直接报错,说当前没有事务

现在就想用

SqlSession sqlSession = sqlSessionFactory.openSession(false);

方式,可为何无法生效事务,有何办法没?

加载中
0
神恰恰
神恰恰

数据库建表的时候,存储引擎是哪个,是否支持事务,很多人被这个坑过。还有就是,如果是调用你的service层的话,事务就交给Spring好了啊,你应该用的是Hibernate吧,Spring事务里面有啊,加载下,直接用注解或者切面,多舒服。

sprouting
sprouting
数据库是支持事务的,请看下我调用service层代码怎么做的,直接注入根本不生效,B公司直接调用我们的代码,好像是绕过了spring
返回顶部
顶部