书上说并发控制的主要技术是封锁。例如两个售票口同时要售票,假设数据库为A,为了让甲卖出一张票后,A中票的数量减一,甲要修改A,为了不丢失甲的修改,须在读除A前先封锁A,直到甲修改并返回A后解除了对A的封锁为止。这样就不会在乙售票的时候看到那张卖出的票。我的疑问是:假设甲读取A前封锁A(应该是写锁吧),那么乙要写A的话,就必须等到甲解锁了。假设甲一直不解锁(或者是很长时间以后再解锁),那乙岂不是卖不了票了(或者要等很长时间)。我觉得这样在现实中是不可取的。请高人解惑。我刚学数据库。大家见谅!~

解决方案 »

  1.   

    在设计应用时
    在发生锁到解锁,中间必须避免交互性操作。让一个事务竞可能地短,才能提高并发.所以出现了一种模式,广泛应用各种语言的控件,这叫BATCH UPDATE
    SELECT * FROM XXX  -- 产生旧值--- 中间是交互性修改提交时再加锁,
    BEGIN TRANSACTION
    SELECT * FROM XXX FOR UPDATE -- 加锁, 并产生新值
    IF 新值=旧值   -- 说明你在交互性修改中,服务器上的数据没有被别人修改
       UPDATTE
    ELSE  -- 已被修改
       -- ROLLBACK 或者处理其他流程
    END IF
    COMMIT
      

  2.   

    在设计应用时
    在发生锁到解锁,中间必须避免交互性操作。让一个事务竞可能地短,才能提高并发.所以出现了一种模式,广泛应用各种语言的控件,这叫BATCH UPDATE
    SELECT * FROM XXX  -- 产生旧值--- 中间是交互性修改提交时再加锁,
    BEGIN TRANSACTION
    SELECT * FROM XXX FOR UPDATE -- 加锁, 并产生新值
    IF 新值=旧值   -- 说明你在交互性修改中,服务器上的数据没有被别人修改
       UPDATTE
    ELSE  -- 已被修改
       -- ROLLBACK 或者处理其他流程
    END IF
    COMMIT