Текущее время: Пт, авг 01 2025, 14:00

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:16 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
В таблице T есть запись F = 0, ID = 2

Один пользователь выполняет примерно следующий код

Code:
Поставить эксклюзивную блокировку (ENQUEUE)
  ...
  UPDATE T SET F = 1 WHERE ID = 2.
  COMMIT WORK.
Снять эксклюзивную блокировку (DEQUEUE)


Другой пользователь выполняет

Code:
Поставить эксклюзивную блокировку (ENQUEUE)
  ...
  SELECT
    F
  FROM
    T
  WHERE
     WHERE ID = 2.
Снять эксклюзивную блокировку (DEQUEUE)


Первый пользователь выполняет свой код немного раньше, второй пользователь в это время ожидает (ENQUEUE с параметром WAIT)
Когда пользователь снимает блокировку, то второй пользователь устанавливает ее и выполняет SELECT. Вопрос - гарантировано
ли он получит запись со значение поля F = 1... или COMMIT WORK первого пользователя по каким-то внутренним причинам
может не успееть зафиксировать транзакцию в БД и второй пользователь сичтает F = 0?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:25 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пт, янв 18 2008, 10:34
Сообщения: 716
Откуда: Moscow
Пол: Мужской
не гарантировано. для таких гарантий есть дополнение к COMMIT WORK
Code:
commit work and wait

_________________
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:28 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
WAIT чего? Чего мы ждем? Между ENQUEUE/DEQUEUE не вызывается никаких CALL FUNCTION UPDATE TASK и т.п.
Есть просто расчетная часть и запись в БД.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:31 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Странный вопрос, если честно. Ставить блокировку перед чтением записи - это зачем?
Если мне не изменяет память - уровень изолированности транзакций, который использует SAP - это RC.
Соответсвенно если данные закомитчены - то прочитает. Если еще нет - то не прочитает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:35 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Я старался предельно ясно описать последовательность действий... посмотрите внимательнее на код


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:36 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Второй пользователь выполняет такой код.... так будет точнее

Code:
Поставить эксклюзивную блокировку (ENQUEUE)
  SELECT
    F
  FROM
    T
  WHERE
     WHERE ID = 2.
  ...
Снять эксклюзивную блокировку (DEQUEUE)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:46 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Помоему я тоже вполне ясно ответил:
Если данные закомитчены - то прочитает. Если еще нет - то не прочитает. При уровне изолированности RC.
Но я был не прав. По умолчанию SAP использует уровент DR. Т.е. гарантированно.
Блокировки же здесь вобще не при чем.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:51 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Объясняю... первый пользователь снимет блокирровку после COMMIT WORK. Блокировка
гарантирует, что второй пользователь в это время будет ждать. После снятия блокировки возможны две
ситуации - либо второй пользователь считает F = 0, либо F = 1... Я считаю, что пользователь гарантировано считает
F = 1... Хочу понять, ошибаюсь ли я или нет... Прошу разъяснений


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:55 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Гарантированно будет 1.
Какие вам еще нужны разъяснения? Уровень изолированности - DR. Грязное чтение. Т.е. даже незакомтченные данные будут прочитаны селектом второго пользователя.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 17:59 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Какое грязное чтение! Прошу больше Вас не отвечать и не вводить людей в заблуждение


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Чт, июл 02 2009, 22:59 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Дорогой друг, все что я могу сделать в этой ситуации - это дать совет на будущее: прочитайте что-нибудь по теории СУБД.
Если рассматривать только связку клиент-сервер СУБД - то ответ я вам дал.
Что касается SAP - возможны варианты. Надо смотреть конкретную ситуацию. Обсуждать поведение системы в таких искусственных ситуациях и в вакуумной сфере - желания нет.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Пт, июл 03 2009, 01:26 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
2 murmur

Данную ситуацию можно решить с помощью блокировок базы данных (не путайте с логическими блокировками САП ENQUEUE, DEQUEUE)

Блокировка базы данных выставляется на записи БД по которым было выполнено update/insert
другой процесс не может сделать update/insert по тому же ключу что и в первом пока в первом не будет сделан commit.

т.е. реально во втором GUI будут висеть часики (ожидание) пока в первом GUI не будет сделан commit (тестировал лично)

В САПе есть такая конструкция select single for update...

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Пт, июл 03 2009, 08:55 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Наверное стоит написать более понятно... ситуация не искусственная... пытаюсь применить оптимистичную блокировку...
Пользователь 1 выполняет редактирование документа не блокируя его. Затем, выполняет сохранение.
Если с момента взятия документа на редактирование, до его сохранения пользователь 2 изменил данные документа,
то пользователь 1 не может выполнить сохранение. Привожу более полный код и хочу узнать какие в нем есть недостатки

Пользователь 1

Взять документ на редактирование
Code:
GET TIME STAMP FIELD P_TS.


...

Спустя какое-то время попытаться сохранить документ
Code:
ENQUEUE NOWAIT.
  CLEAR V_TS.
  SELECT SINGLE V_TS FROM T WHERE ID = 5.
  IF P_TS > V_TS.
     ... useful work
    COMMIT WORK.
  ELSE.
    WRITE / 'Ошибка'.
  ENDIF.
DEQUEUE.


Пользователь 2 (с высоким приоритетом)
Code:
ENQUEUE WAIT.
   ... useful work
  COMMIT WORK.
  GET TIME STAMP FIELD V_TS.
  UPDATE T SET TS = V_TS WHERE ID = 5.
  COMMIT WORK.
DEQUEUE.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Пт, июл 03 2009, 09:08 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Недостаток
Цитата:
Пользователь 1 выполняет редактирование документа не блокируя его.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о COMMIT WORK
СообщениеДобавлено: Пт, июл 03 2009, 09:21 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Вс, янв 11 2009, 14:41
Сообщения: 902
Откуда: Москва
Пол: Мужской
Не блокировать документ - основное требование!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB