Документация по PHP говорит:
Если вы никогда не сталкивались с транзакциями раньше, они предлагают 4 основных Особенности: Атомность, Консистенция, Изоляция и Долговечность (ACID). В нестандартные условия, любая работа, выполняемая в транзакции, даже если она осуществляется поэтапно, гарантируется, что будет применяться к базе данных безопасно и без помех от других соединений, когда это совершенные.
ВОПРОС:
Означает ли это, что я могу иметь два отдельных скрипта php, выполняющих транзакции одновременно, без их вмешательства друг в друга?
РАЗРАБОТКА НА ЧТО Я ЗНАЛ "ВМЕШАТЕЛЬСТВО" :
Представьте, что мы имеем следующую таблицу employees
:
__________________________
| id | name | salary |
|------+--------+----------|
| 1 | ana | 10000 |
|------+--------+----------|
Если у меня есть два сценария с похожим/одинаковым кодом, они запускаются в одно и то же время:
script1.php и script2.php (оба имеют один и тот же код):
$conn->beginTransaction();
$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary
$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);
$conn->commit();
и предполагая, что последовательность событий такова:
-
script1.php выбирает данные
-
script2.php выбирает данные
-
script1.php обновляет данные
-
script2.php обновляет данные
-
script1.php commit() происходит
-
script2.php commit() происходит
Какова была бы заработная плата ana в этом случае?
-
Было бы 11000? И будет ли это тогда означать, что одна транзакция будет перекрываться с другой, потому что информация была получена до того, как произошла какая-либо фиксация?
-
Было бы 12000? И будет ли это тогда означать, что независимо от порядка, в котором данные были обновлены и выбраны, функция
commit()
заставила их произойти индивидуально?
Пожалуйста, не стесняйтесь подробно описывать, как транзакции и отдельные скрипты могут помешать (или не мешать) друг другу.