STRUTS2 中使用事物需要注意的一点

来源:互联网 发布:守望先锋网络解决不了 编辑:程序博客网 时间:2024/05/16 18:49

               STRUTS2拦截器机制用于事务要注意的一点

     最近朋友用struts2+Spring+hibernate 做了一个项目,但是项目中遇到了一个很费解的问题,

    项目页面显示使用的是标准的frameset结构。

在页面点击了修改项后,数据库中的数据修改了,然而,页面显示的值并没有修改,最初我给出的建议是直接是在转向这个页面之前重新刷新一次这个显示列表frame,但是当细致的分析了项目的事务提交机制后,我感到以前的建议是完全错误的。这个错误,并不是frame的缓存导致的而是此项目中struts2的事务提交的设计错误导致的。

项目中一个请求的大致过程如下。

   首先页面发送一个请求到StrutsAction,在此前,struts2的拦截器打开了事务,

   到了action后 

   做了一些操作,1:更新了数据库

                 2:取出了数据

                 3:将数据存放在这个list中,然后返回

   返回的过程中,struts的后置拦截器关闭了事务

   然后回到了目标jsp页面

      然而看似这样一个天衣无缝的设计,在实际操作中确存在着一个错误

 

   典型的脏读在此悄然的发生,很有迷惑性。

  

   且看是怎么发生的

      进入到action 后, 我的事务已经打开,

      更新数据库后,   事务未提交

      此时我又取得一个数据集合,想把他保存在list中,而此时取得的数据我想还是  session中原有的数据,脏读发生了。

      从action中出来,struts2的拦截器提交了事务。但是、此时的list中保存的数据并没有变化,

     最后到了jsp显示页面,就显示的还是原来的数据。

  

   那么我们该怎么避免这个问题,我才疏学浅,只写写自己知道的几点,希望各位朋友不要再走弯路

  1. 不使用事务,使用默认的提交机制  

  2. Struts不参与事务管理,这个设计有问题。

  3. 事务只用在dao层,类似与spring的事物管理。

当然还有其他更好的方法,我学识有限,若有这方面的高手,还请入群赐教。

 

Copy by litao 2010-8-18  (IT盟,精英会 :83092866)   

原创粉丝点击