其实我就是想问怎么实现像在oracle里那个for update nowait的功能。我的需求是:
    公司要给A加班费100块钱,我看到了,给A准备100块钱,正在我准备的时候,公司说要给A 300块钱,这时候别人看到了,就准备给A 300元。而实际上,另外的那个人应该看到我正在给A 100块钱的时候(也就是我占有A的数据的更新权限的时候),就报错,说A正在被我更新。现在我的问题是:
在我试验的所有内容,包括
lock tables tt write
select * from tt for update;
....
unlock tables

start transaction
select * from tt lock in share mode;
....
commit/rollback
这两种方法,
都是一个事物在没有解开的时候,另一个总是等待。我找了2、3天了,不知道是我笨还是点儿背,
都没有找到怎么让第2个事务不等待,马上报错的办法。请问mysql里面,有没有能实现“nowait”的类似方法?谢谢!good luck

解决方案 »

  1.   

    虽然我不太了解,但好像是可以用get_lock()与release_lock().首先A事物用get_lock("uplock",10),MYSQL返回1就是可以取得锁,B事务要进行工作先也要get_lock("uplock",10)一下,如果10秒内得不到锁,MYSQL就会返回0,A事务完成后release_lock("uplock"),B事务再get_lock就可以得到锁进行自己的工作了.
      

  2.   

    太谢谢了!
    已经能锁定某个表了。不过看起来好像这种方法是对整个表进行锁定。
    或者说这种方法更像一个对操作的表安装一个用来表示“已锁”或者“未锁”的“标志”。这样的话,
    是不是对程序执行效率的影响会比较大呢?
    mysql没有对行一级的锁定吗?oracle 里面的nowait关键字还是很方便的。mysql这点上不行?
    不会只有我有这种需求吧??郁闷呀!
      

  3.   

    很遗憾,MYSQL没有NOWAIT
    但POSTGRESQL有,和ORACLE很近
      

  4.   

    哦!
    难道实现很难吗?? :(搞不懂了!还想了解一下,
    其他大侠们是怎么解决这个问题的呀?good luck
      

  5.   

    因为没有NOWAIT,所以设计的时候尽量将TRANSACTION占用短的时间,最忌讳在一个TRANSACTION中有交互动作,
    设计的模型应该是:
    1。SELECT * FROM XXXX WHERE KEY=XXX -- 你的客户软件要有缓冲功能,即能保存旧值
    2。交互动作,中间你可能去厕所
    3。提交,这时启动TRANSACTION,因为你所修改的资料可能在服务器被他人修改,所以要比较原值。
    START TRANSACTION
    SEKLECT * FROM XXX WHERE KEY=XXX FOR UPDATE; -- 加锁
    如果服务器当前值<>上次SELECT出来的旧值 则报错,否则更新
    COMMIT
      

  6.   

    我们原来用过一个framework就是用得你说的方法,
    每个表里面都有一个叫做“更新次数”的字段,
    然后有共同函数进行处理。因为是共同函数,所以当时用的挺爽的,现在轮到自己写framework了,变成麻烦事了!
    嘿嘿!不过也挺有意思的!谢谢你的回答了!
    马上给分