问一个 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的我记得...查询专用好像也是不开启的意思