问题描述:
   在此系统中,所有管理员都可以改订单.   
   现在一张订单A.
   管理员u1在管理页面上点击更新,
   服务器执行(假定使用oracle),
   begin;
     select * from order where id = 'A' for update; //锁定
   这样得到订单A的数据,并呈现在页面上,等u1修改,到这里第一个请求完成了.
   ....
   u1修改完成后,提交数据,服务器执行:
     update order set .... where id = 'A';
   commit;

   到此第二次请求完成.
  
红色部分要怎么实现? 在jdbc下或hibernate

解决方案 »

  1.   

     有趣 关注 如果将该记录for update 并返回页面 此时数据库连接应该已经中断(或回池) 那么刚刚的事务是不是就直接回滚了呢 会不会此事务已经不存在了 因为如果不中断连接显然有问题 所以我觉得连接肯定中断了 那么之前的事务应该已经没了。 这种问题不能简单的就用乐观锁实现么 在更新的时候判断数据是否仍有效 已经被修改过则处理异常从新读一次数据给当前管理员 水平有限 简单说说看法  主要是标记下 等达人解答..
      

  2.   

    你这个好象没有用到跨事务吧,使用Hibernate 本地事务就可以了。
    可以使用乐观锁的机制。再把数据库事务改成read-commit 就可以了!
      

  3.   

    HTTP 请求是无状态的,而事务必须在有状态的环境下才能确定,因此这样的需求在目前的技术层面是不可行的。即使是采用 HttpSession 保存用户请求状态,将数据库连接进行保存,但这样会导致严重的后果。比如说,在第一步完成后,用户关闭了浏览器,或者断电了,直接导致数据库连接在 Session 销毁前产生连接泄漏。另外,你这个跟事务跨请求完成没有关系。因为你的第一步操作只是个 SELECT,查询并不需要事务。如果为了保证在进行第二步期间,数据库没有被其他用户修改,如果这种并发可能性不是很大的话,可以采用基于版本号的乐观锁。
      

  4.   

    select * from order where id = 'A' for update; //锁定这个是锁定整表不是锁定行记录
      

  5.   


    对于oracle 这是锁定行