最近在做商城的后台订单系统,需要在对正在编辑的订单记录进行锁定,修改完才去解锁,
避免客服之间的订单处理出现数据不一致或被覆盖。网上有三中解决方法:
1、独占模式  2、记录集锁定  3、页面锁定但是不知道具体怎么实现。我是用Java+MySQL开发的。请教高手!!!!!

解决方案 »

  1.   

    记录增加一个字段用来标识是否锁定在编辑记录的时候,先更新字段,根据更新字段的返回值,判断是否有人在更新 。需要设置一个session监听,控制直接关闭IE的情况。
      

  2.   

    使用GET_LOCK()和RELEASE_LOCK()来互斥这个操作,可以互斥多个session,而且性能很高。
      

  3.   

    在B/S结构下,利用数据库的内在锁定如行锁、表锁、应用锁都是不成功的。
    因为这些锁是基于连接的,一旦连接释放,这些锁是自动释放。
    而B/S结构的特点是, 每一次请求都是一个连接,请求完,连接释放。锁也自动释放。所以只能按1楼的方法,自己增加字段来模拟锁。
    但必须有个自动清除锁的机制,以免客人中断提交,导致这个锁永远存在的问题。
      

  4.   

    而B/S结构的特点是, 每一次请求都是一个连接,请求完,连接释放。锁也自动释放。---没太听懂1任何订单都不能用数据库的事物功能么?
    2是不是可以这样理解,数据库的事物功能是给相对短暂的保持服务的。而订单取走数据后,把数据相对保持很长的时间。而这段时间一般超过了,数据库连接的timeout。?
      

  5.   

    其实, 只要不是分布式事务,还是可以利用数据库的事务特性的。
    对楼主的问题,使用可复复读的可离级就够了。
    关键在于业务逻辑的处理,建议使用模拟式的乐观锁定。即begin trans
    update table set <col>=? where id=? and col=:old_col and col1=:old_col1 and col2=:old_col2 ....
    commit trans
    使用old值进行限制,如果在update期间,有人改了这条记录,那么这条update肯定不会成功,
    affected_count必然会是0。
    如果成功了,那么自然没有别人修改这条记录。
    这是一种比较有效的做法。在Scott大作<<Oracle专家高级编程>>一书中屡有提及。