Vinyeah 2009-07-12 15:56
浏览 163
已采纳

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

  • wanghaolovezlq 2009-07-12 16:03
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退