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

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

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

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

Ответы [ 3 ]

3 голосов
/ 08 января 2010

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

Всего один случайный пример:

Клиент 1 намеревается а) вычесть 10 из целого числа column_x (= 10), а затем b) добавить эти 10 к целому числу column_y.

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

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

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

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

0 голосов
/ 08 января 2010

Если вы используете 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 голосов
/ 08 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...