Vinyeah
Vinyeah
2009-07-12 15:56

求解惑。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条回答