请教怎么让2个事务*互斥不进行等待*马上报出异常

请问如何让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

请教怎么让2个事务*互斥不进行等待*马上报出异常

相关文章:

你感兴趣的文章:

标签云: