Сценарии php & ruby, обращающиеся к одной и той же базе данных и таблице, могут вызвать повреждение?

0

У меня есть php файл, который регулярно пишет и читает таблицы из mysql DB.

У меня есть еще один файл ruby, который запускается одновременно с чтением и записью в те же таблицы в DB mysql.

могут возникнуть проблемы с этой настройкой?

Теги:
concurrency

3 ответа

3

MySQL не заботится, не PHP или Ruby. Да, есть потенциальные проблемы с несколькими клиентами, обращающимися к базе данных одновременно. Там может быть много ошибок.

Только один случайный пример:

Клиент 1 намеревается a) вычесть 10 из целочисленного столбца_x (= 10), а затем b) добавить этот 10 в целочисленный столбец_y.

Представьте, что клиент 1 выполняется с шагом а), но прежде чем ему удастся выполнить б), приходит клиент 2, намереваясь что-то сделать, только если значение column_x или column_y положительно. И ошибочно ничего не делает, поскольку 10 еще не прибыли в column_y.

В основном вы получаете все проблемы несколько потоков выполнения с общим состоянием.

Для решения таких проблем существуют транзакции. MySQL предоставляет несколько уровней изоляции транзакций, которые зависят от механизма хранения ваших таблиц.

Таким образом, все модификации (и чтение для уровня изоляции REPEATABLE READ и SERIALIZABLE) должны выполняться в транзакции базы данных, начиная с START TRANSACTION и заканчивая выражением COMMIT SQL. Если в середине вашей процедуры есть проблема, и вы не можете завершить транзакцию в целом, выполните ROLLBACK, чтобы отменить все изменения, сделанные с момента вызова START TRANSACTION.

0

Предполагая, что вы используете MySQL, вы можете использовать:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

для получения дополнительной информации вы можете обратиться к:
http://dev.mysql.com/doc/refman/5.0/en/commit.html
http://www.tutorialspoint.com/mysql/mysql-transactions.htm

0

Да. Есть. Вы должны использовать транзакции, чтобы гарантировать, что только один экземпляр обращается к данным, а если есть ошибка, вы можете откат.

Также это зависит от того, какой механизм хранения вы используете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню