在每行有一个计数器(只是一个整数值)的表,我需要的电流值,并增加它在同一时间。
实际上,我想这样做:
SELECT counter FROM table WHERE id=123
UPDATE table SET counter=counter+1 WHERE id=123
Run Code Online (Sandbox Code Playgroud)
但是这样做作为两个查询显然不是线程安全的:多个进程做同样的事情(在同一行)可能会得到相同的计数器值。我需要它们都是独一无二的,所以每个过程都会获得实际的当前值并将其增加一。
我可以想到一种结构,在其中我对每行实施手动锁定,但我想知道是否有更简单的方法来做到这一点?
Ulr*_*bor 17
更新语句在没有之前选择的情况下工作得很好!由于单个语句根据定义是安全的,即使同时执行两个 UPDATE 查询也只会导致行增加两次。
如果您确实想为您的 PHP 脚本选择值,用它做一些事情,然后想更新这个确切的计数器值,您可以执行以下操作:
BEGIN;
SELECT `counter` FROM `table` WHERE `id` = 123 FOR UPDATE;
UPDATE `table` SET `counter` = `counter`+1 WHERE `id` = 123;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
这将启动一个新事务,然后选择要更新的行并以独占方式锁定它们。然后,您可以安全地更新这些内容,而无需担心其他客户端更改其内容甚至访问锁定的行。最后,您需要提交更改。
您还应该阅读有关隔离级别的内容。您可能不想要READ UNCOMMITTED
隔离级别之类的值。对于这个用例,其他一切都应该没问题。
归档时间: |
|
查看次数: |
32873 次 |
最近记录: |