Php concurrency mysqli [дубликат]

Вам нужно передать объект и метод вместе как массив:

call_user_func(array($Player, 'SayHi'));

См. обратные вызовы , в частности:

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

21
задан medium 12 May 2018 в 12:08
поделиться

1 ответ

Операторы SQL являются атомарными. То есть, если вы выполните что-то вроде этого:

UPDATE Cars SET Sold = Sold + 1

Во время этого утверждения никто не может изменить переменную Sold.

Проблема возникает, если у вас есть утверждения, которые зависят друг от друга:

a = SELECT Sold FROM Cars;
UPDATE Cars SET Sold = a + 1;

Между этими запросы, другой пользователь может изменить таблицу Cars и обновить Продано. Чтобы предотвратить это, заверните его в транзакцию:

BEGIN;
a = SELECT Sold FROM Cars;
UPDATE Cars SET Sold = a + 1;
COMMIT;

Транзакции поддерживаются InnoDB, но не MyISAM.

23
ответ дан Sjoerd 15 August 2018 в 18:14
поделиться
  • 1
    спасибо за это объяснение. – medium 28 January 2011 в 14:13
  • 2
    Даже в транзакции нет никакой гарантии. MySQL по умолчанию делает блокировку на уровне строк / блокировку только для операций записи даже в транзакциях. Чтобы a имели правильное значение, необходимо поместить FOR UPDATE в SELECT или указать более высокий уровень изоляции на TRANSACTION как SERIALIZABLE . Дополнительная информация: Внутренняя блокировка , Уровни изоляции , Блокировка чтения – Alan CN 5 January 2017 в 19:51
Другие вопросы по тегам:

Похожие вопросы: