SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.02.2009 20:14:38

Роман
Участник
Зарегистрирован: 16.02.2009
Сообщений: 1

хранимая процедура с селектом и апдейтом

хранимая процедура с селектом и апдейтом одной и той же таблички - почему-то выполняется дважды...
есть такая процедура:
CREATE PROCEDURE `UpdSubs`(IN SID int, IN UpDown Tinyint)
    MODIFIES SQL DATA
BEGIN
  declare s tinyint;
  declare Rez int;
  declare Comm varchar(50);
  Select Subscribers.State INTO s from Subscribers where Subscribers.SubscriberID=SID LIMIT 1;
  if UpDown = 1 then #up of reserv
       if s = 1 then
          set Rez = 0; Set Comm = 'Service was Up before Услуга уже включена';
       else
          set Rez = 1; Set Comm = 'Service is now Up Услуга включена';
          update Subscribers set State = 1 where SubscriberID = SID;
       end if;
  else
       if s = 0 then
          set Rez = 0; Set Comm = 'Service was Down before Услуга уже отключена';
       else
          set Rez = 1; Set Comm = 'Service is now Down Услуга отключена';
          update Subscribers set State = 0 where SubscriberID = SID;
       end if;
  end if;
  select Rez, Comm;
END

делаем select * from Subscribers where SubscriberID=10000000, убеждаемся что State=0
вызывает стореду: call UpdSubs(10000000,1), которая возвращает результат: Rez=0, Comm = 'Service was Up before Услуга уже включена'
опять делаем select * from Subscribers where SubscriberID=10000000, убеждаемся что State=1
вобщем путем всяческих изменений стореды ясно одно - она выполняется два раза от начала до конца, при этом второй раз уже с измененным State. (так же и зациклить недолго....если алгоритм другой будет.)
Наверное стореда выполняется в неявной транзакции, и когда после селекта таблички видит что эта табличка изменилась - заставляет пройти все сначала....незнаю.
Я в MySQL новичек, подскажите в какую сторону идти.

Да, алгоритм стореды сознательно упрощен для наглядности, не стоит предлагать перестроить алгоритм, чтобы избежать ситуацию select-->update.

Неактивен

 

#2 17.02.2009 19:33:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: хранимая процедура с селектом и апдейтом

Какая версия MySQL? Какие "всяческие изменения"?

[aquatica] root test > create table Subscribers (SubscriberID INT, State INT);
Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > insert Subscribers values (10000000, 0);
Query OK, 1 row affected (0.00 sec)

[aquatica] root test > \d;;
[aquatica] root test > CREATE PROCEDURE `UpdSubs`(IN SID int, IN UpDown Tinyint)
<cut>
Query OK, 0 rows affected (0.02 sec)

[aquatica] root test > call UpdSubs(10000000,1);
    -> ;;
+------+-------------------------------------------------+
| Rez  | Comm                                            |
+------+-------------------------------------------------+
|    1 | Service is now Up Услуга включена               |
+------+-------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > call UpdSubs(10000000,1);;
+------+------------------------------------------------------------+
| Rez  | Comm                                                       |
+------+------------------------------------------------------------+
|    0 | Service was Up before Услуга уже включена                  |
+------+------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > call UpdSubs(10000000,0);;
+------+-----------------------------------------------------+
| Rez  | Comm                                                |
+------+-----------------------------------------------------+
|    1 | Service is now Down Услуга отключена                |
+------+-----------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > call UpdSubs(10000000,0);;
+------+----------------------------------------------------------------+
| Rez  | Comm                                                           |
+------+----------------------------------------------------------------+
|    0 | Service was Down before Услуга уже отключена                   |
+------+----------------------------------------------------------------+
1 row in set (0.00 sec)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson