并发访问MySQL存储过程

时间:2014-04-24 18:14:57

标签: mysql stored-procedures

我正在使用存储过程来进行一些计算来更新表。我担心的是,如果多个用户同时访问此存储过程,我的计算将是错误的。我不知道这是可能的,因为我对MySQL知之甚少。我想要实现的是允许一次只访问一个用户的存储过程。这种情况是默认处理还是我必须做一些额外的工作。

1 个答案:

答案 0 :(得分:1)

无法控制MySQL中对存储过程的并发访问。您需要控制对表的相应行的并发访问。这并不难。

这是你做的:

首先,使用InnoDB或其他一些具有交易功能的访问方法。 MyISAM不起作用。

其次,识别操作围绕的某个表中的某个特定行。例如,作为计算的一部分,您可能会在名为“calc”的表中更新id数字为17的行。您SELECT这一行FOR UPDATE,这将阻止其他

第三,编写存储过程代码如下:

 /* make sure you'll clean up correctly if something goes wrong */
 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

 /* begin a transaction */
 START TRANSACTION;
 ...

 /* lock the row you want to update, or to use to control concurrency */
 SELECT id FROM calc WHERE id=17 FOR UPDATE;
 ...

 /* do your calculations and updates */
 ...

 /* when you're done, commit the transaction */
 COMMIT;     

关于这一点很酷的是,对特定行的每次并发访问都会延迟SELECT ... FOR UPDATE的完成,直到前一个完成COMMIT。如果您有并发客户端更新不同的行,它们将同时运行。