求解惑。SSH架构,Spring的事务管理和Hibernate的Flush操作.

SSH架构的一个程序,Spring的事务管理做了配置,对所有service中get开头的函数事务属性配置为PROPAGATION_REQUIRED, readonly. 在struts action中调用了这个方法。

action(){
serviceA.getxxx(); //PROPAGATION_REQUIRED, readonly
serviceB.doXXXX(); //PROPAGATION_REQUIRED
}

但是serviceA.getxxx方法也做了数据库的修改,最后发现修改还提交到了数据库。。。
我个人理解这里应该是启2个事务。第一个是只读的。第二个是提交的。可是第二个提交的时候怎么把第一个的修改也提交了.....

后来换成了这种方式
action(){
serviceA.getxxx(); //PROPAGATION_REQUIRED, readonly
ccccDAO.flush();  //调用了hibernateSession的flush方法。
}
发现serviceA.getxxx()里修改的数据也能提交到数据库。

感觉像是第一个只读事物中的对象修改,经过第二个事物中hibernate的flush,也能提交数据库。造成了第一个readonly事务失效??

问题补充

binlaniua 写道
你是不是加了个
OpenSessionInView 过滤器啊???


的确如此。求解???
问题补充:
引用

OpenSessionInView 就把整个action的执行当成一个事务来提交,

一次交互也就是一个线程一次提交


那这种情况下serviceA.getxxx(); //PROPAGATION_REQUIRED, readonly 确实是失效了.....spring还能如何实现事务只读呢?
问题补充:
引用

spring本身就实现了事务只读,只不过你用了OpenSessionInView 的模式导致它失效了,

去掉OpenSessionInView试看看

去掉的话确实能只读了。我想知道在OpenSessionInView存在都情况下,spring是否还有办法实现第一个事务只读.第二个事务提交..

6个回答

OpenSessionInView 就把整个action的执行当成一个事务来提交,

一次交互也就是一个线程一次提交

配置文件里是不是路径写错了?

你是不是加了个
OpenSessionInView 过滤器啊???

分开操作 readonly 有效吗?

spring本身就实现了事务只读,只不过你用了OpenSessionInView 的模式导致它失效了,

去掉OpenSessionInView试看看

那就得编码规范要严格了,
你不能在只读的操作中进行更新等操作,

这是潜规则的一种嘛,如果程序员写代码都这么不规范,那代码质量可想而知,
还谈什么架构设计,可扩展性,可维护性,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问