最近接手一个接口的开发工作,代码都写的差不多了,测试的时候忽然发现事务没有生效,先说下项目吧,我们是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);
方式,可为何无法生效事务,有何办法没?
数据库建表的时候,存储引擎是哪个,是否支持事务,很多人被这个坑过。还有就是,如果是调用你的service层的话,事务就交给Spring好了啊,你应该用的是Hibernate吧,Spring事务里面有啊,加载下,直接用注解或者切面,多舒服。
数据库是支持事务的,请看下我调用service层代码怎么做的,直接注入根本不生效,B公司直接调用我们的代码,好像是绕过了spring版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。