Я использую MySQL для механизма распределенной блокировки. Это работает довольно хорошо, однако у меня есть одно очень маленькое состояние гонки, которое я никогда не выполнял, но мне любопытно, есть ли у меня другие варианты, чтобы избежать этого.
В настоящее время в моем коде я вызываю GET_LOCK, а затем сразу после этого я вызываю IS_USED_LOCK, чтобы получить идентификатор соединения, удерживающего блокировку. Это необходимо, чтобы я мог наблюдать за тем, как он меняется, и сигнализировать о других событиях. Однако, похоже, что я могу вызвать GET_LOCK, получить блокировку, а затем потерять ее в миллисекундах перед вызовом IS_USED_LOCK.
Есть ли у меня возможность атомарно вызвать GET_LOCK и получить идентификатор блокировки?
UPDATE:
Я не знал, SELECT GET_LOCK('test/lock', 10), IS_USED_LOCK('test/lock');
возможно, но не уверен, что внутри это на самом деле атомарно.