Spring 事务相关

Transactionz注解的readOnly属性讲解:
结论1:readOnly=true表明所注解的方法或类只是读取数据。
readOnly=false表明所注解的方法或类是增加,删除,修改数据。

从他的描述Read/write vs. read-only transaction,就能猜出一二来。
如果设置为true,spring会对其优化,可以用来提高性能。他提供了不一样的connection
结论2: 摘自http://geng2483759.iteye.com/blog/319768

你应该仔细看一下Spring的文档,在事务那一章有明确的解释:

“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。

但是你非要在“只读事务”里面修改数据,也并非不可以,只不过对于数据一致性的保护不像“读写事务”那样保险而已。

因此,“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可。

1. 和spring文档没有任何关系,spring事务仅仅是一层封装,最后都要调用底层驱动的setReadonly方法来开启。
2.在大多数数据库系统下,只读事务里面是不可以修改数据,并且,在同一个事务里面同一个sql读出来的同一条记录是不会变化的,这是我们开启readonly最重要的原因:我们需要能够可重复读。
3. 在一个系统中,为了保证在同一个事务中读取数据的一致性,对一系列读操作开启readonly是很重要的做法,并不仅仅是性能优化的推荐配置。
4. 最重要的是,spring的DataSourceTransactionManager确实不支持readonly,我开头的连接中已经给出了原因。

1.readonly语义不是所有的数据库驱动都支持的。
2.在spring+hibernate的条件下,readonly有一些优化
http://www.iteye.com/topic/95124

说的没错, 有的数据库驱动是不支持readonly的。但在oracle下绝对支持,上面也已经验证过了。
顺便回答下你帖子里一个问题: 使用jdbc不但没有优化,压根jdbc的这个DataSourceTransactionManager就不支持readonly。因为它源代码里面没有一处调用con.setReadOnly(true)之类的方法。
而HibernateTransactionManager中正如你所说的会有这么一段:

猜你喜欢

转载自fangguanhong.iteye.com/blog/2389593