我正在使用存储过程来进行一些计算来更新表。我担心的是,如果多个用户同时访问此存储过程,我的计算将是错误的。我不知道这是可能的,因为我对MySQL知之甚少。我想要实现的是允许一次只访问一个用户的存储过程。这种情况是默认处理还是我必须做一些额外的工作。
答案 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
。如果您有并发客户端更新不同的行,它们将同时运行。