当前位置: 代码迷 >> Java Web开发 >> Spring下怎么不启用事务(Transactional)直接访问数据库
  详细解决方案

Spring下怎么不启用事务(Transactional)直接访问数据库

热度:280   发布时间:2016-04-13 22:33:26.0
Spring下如何不启用事务(Transactional)直接访问数据库?

问一个 Transcational 事务 的问题。
下面几组代码,分别是 Service代码、Controller代码、控制台打印数据:


  public Object test() {
    // this.sessionFactory.openSession();
    // this.debugLogger.debug("start test");
    // Long x = this.queryScalar("select count(*) from QnzsMessage");
    // this.debugLogger.debug("finish test");
    return 0;
  }

  @Transactional(propagation = Propagation.NEVER)
  public Object test1() {
    return 1;
  }


  @RequestMapping(method = RequestMethod.POST, value = "test")
  public @ResponseBody
  ResponseVo test() {
    this.debugLogger.debug("start test_0");
    Object value = this.qnzsMessageService.test();
    this.debugLogger.debug("finish test_0");
    this.debugLogger.debug("start test_1");
    value = this.qnzsMessageService.test1();
    this.debugLogger.debug("finish test_1");
    return ResponseVo.status(ResponseVoConstant.OK).value(value);
  }


2015-08-22 21:55:27:167[DEBUG]: start test_0
2015-08-22 21:55:27:189[DEBUG]: finish test_0
2015-08-22 21:55:27:189[DEBUG]: start test_1
2015-08-22 21:55:27:189[DEBUG]: finish test_1
2015-08-22 21:55:27:329[DEBUG]: start test_0
2015-08-22 21:55:27:349[DEBUG]: finish test_0
2015-08-22 21:55:27:349[DEBUG]: start test_1
2015-08-22 21:55:27:349[DEBUG]: finish test_1
2015-08-22 21:55:27:474[DEBUG]: start test_0
2015-08-22 21:55:27:494[DEBUG]: finish test_0
2015-08-22 21:55:27:494[DEBUG]: start test_1
2015-08-22 21:55:27:494[DEBUG]: finish test_1


注释:Service类上打了 Transactional 注解,从而每个方法默认开启事物。

从控制台时间消耗看出:
在不连接数据库的情况下,Transcational(progration = NEVER) 注解下的方法耗时 0ms,注解下 耗时 15ms+

很明显,15ms不合理,我怀疑是事务的“提交”操作耗时。

而在一些仅查询的操作中,我也不希望事务“提交”。

但是现在,我不开启事务的话,没法连数据库:总是报No Session found in current Thread.

那么现在我想问的问题就是:
1、开启事务,是否查询类数据库访问也会额外消耗“提交事务”的时间?我觉得是的;
2、如果1是真的,如何配置、注解,使 查询类操作 不启用 事务?
------解决思路----------------------
事务的话不要直接加在service类上面,建议分方法写,比如保存和修改、删除这种必须加上,查询的方法就没必要加了
------解决思路----------------------
查询上面不是不加@注解就行了?
或者progration 有个READONLY的我记得...查询专用好像也是不开启的意思
  相关解决方案