日期:2014-05-16  浏览次数:20857 次

请问如何让2个事务*互斥不进行等待*,马上报出错误。
其实我就是想问怎么实现像在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



------解决方案--------------------
虽然我不太了解,但好像是可以用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就可以得到锁进行自己的工作了.
------解决方案--------------------
因为没有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