在网上查的都是查询时加锁。然后其他人就不能修改,删除这条记录了。但是我要的是我锁定一条记录,别人查都不能查,必须等我解锁之后才能查。业务是这样的,当用户要修改一条记录时,必须先判断这条记录符不符合条件(先查询判断,再修改)。假设A,B两人在几乎相同的时间进行此操作。执行顺序是这样的,A,B先后执行查询,然后A执行修改,B又执行修改。但是A执行修改后,记录已经不符合修改条件了。B不应该再修改。应该等待A执行完所有的动作之后再执行B的动作。因为是多台应用服务器,不能再程序的线程等方面下工夫,只能在数据库层面想办法

解决方案 »

  1.   

    不需要加锁,通过时间戳进行排他处理,
    在表中建立一个字段updateTime, A,B先后执行查询,分别获取updateTime,A执行修改,更新updateTime,
    B又执行修改,这个时候用updateTime和表中updateTime比较,如果不一致说明这条记录被其他人修改了,B这次操作不能进行。
      

  2.   

    为什么要这样子?并发性一下子降低了很多
    A select之前手工加X锁
      

  3.   

    for update 不就可以了嘛
      

  4.   

    这个需要好像有点问题。
    在 Oracle里的锁机制来说 ,
    A更新不影响B的查询,B会从回滚段中重构原来的数据,仅仅当B也需要更新的时候,如果A未提交和回滚则出现阻塞,否则B能够进行更新。
    其次Oracle的最高事物级别SERIALIZABLE好像也不支持B不能查询  
    READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。READ COMMITTED 允许幻想读、不可重复读,不允许脏读REPEATABLE READ 允许幻想读,不允许不可重复读和脏读SERIALIZABLE 幻想读、不可重复读和脏读都不允许