2012-04-23 6 views
5

Я искал через Интернет и понимаю, что единственный способ изменить тело процедуры магазина - это сбросить и создать его снова. В этом механизме нет ничего плохого, но если у меня есть клиентское приложение (или тысячи распределенных клиентов), которое вызывает вызов процедуры хранилища для обновления некоторых данных в базе данных сервера, отказ от процедуры приведет к утрате данных и/или повреждению.MySQL: Как изменить хранимые процедуры атомарно?

Я думаю, что если есть синтаксис, такой как «СОЗДАТЬ ПРОЦЕДУРА ЕСЛИ СУЩЕСТВУЕТ ...» или что-то функционирует аналогичным образом, чтобы операция обновления выполнялась плавно. Тем не менее я не нашел такую ​​вещь доступной в MySQL.

Как вы, ребята, думаете, что эту проблему можно решить? Удивительные мысли?

+0

Поскольку у MySQL нет транзакционного DDL, я не думаю, что это будет возможно. –

ответ

3

Вы не можете изменить хранимую процедуру (хотя вы можете изменить ее характеристики) в MySQL. На странице ALTER PROCEDURE.

Эта инструкция может использоваться для изменения характеристик хранимой процедуры . Более чем одно изменение может быть указано в инструкции ALTER PROCEDURE . Однако вы не можете изменить параметры или тело хранимой процедуры , используя этот оператор; для внесения таких изменений вы должны: отменить и заново создать процедуру, используя ПРОЦЕДУРА РАЗМОРАЖИВАНИЯ и СОЗДАТЬ ПРОЦЕДУРА.

Хотя при выполнении этого обновления возможно потерять данные (хотя это должно быть относительно небольшое окно), маловероятно, что ваши данные будут повреждены. Я бы взглянул на технологии очередей сообщений, если ваша система должна быть защищена от потери данных из-за простоев базы данных.

+0

По поврежденным данным я имел в виду целостность базы данных ... У вас там хорошая точка, поэтому вместо того, чтобы вкладывать всю работу в базу данных, мы можем иметь отдельный слой сверху, чтобы не заметить транзакцию данных. –