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事务失效??
问题补充
OpenSessionInView 过滤器啊???
的确如此。求解???
问题补充:
OpenSessionInView 就把整个action的执行当成一个事务来提交,
一次交互也就是一个线程一次提交
那这种情况下serviceA.getxxx(); //PROPAGATION_REQUIRED, readonly 确实是失效了.....spring还能如何实现事务只读呢?
问题补充:
spring本身就实现了事务只读,只不过你用了OpenSessionInView 的模式导致它失效了,
去掉OpenSessionInView试看看
去掉的话确实能只读了。我想知道在OpenSessionInView存在都情况下,spring是否还有办法实现第一个事务只读.第二个事务提交..