Spring的事务经常会有这样的配置:
1
或者这样的注记:
1 @Transactional(readOnly = true)
正好我正在做的项目中这样配置了,而且偶然发现配置了不生效,本着“不弄明白对不起祖国对不起人民”的精神,参考了不少帖子和文档,总结了网上形形色色的答案,稍有收获,规整如下,不正确请指出。
1 readonly并不是所有数据库都支持的,不同的数据库下会有不同的结果。2 设置了readonly后,connection都会被赋予readonly,效果取决于数据库的实现。3 在ORM中,设置了readonly会赋予一些额外的优化,例如在Hibernate中,会被禁止flush等。
经实践,上面的观点基本正确。
环境:Spring-3.1.1、jdk6、oracle-11gR2、mysql-5.6.16、ojdbc6、mysql-connector-java-5.1.31、ibatis-2.3.4.726等,使用的Spring的DataSourceTransactionManager 事务管理器。
查看DataSourceTransactionManager 相关代码可知readOnly值最终是传给Connection的:
1 //Set read-only flag.
2 if (definition != null &&definition.isReadOnly()) {3 try{4 if(logger.isDebugEnabled()) {5 logger.debug("Setting JDBC Connection [" + con + "] read-