Гость
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Клиент. Обработка блокировок при выполнении запросов. / 9 сообщений из 9, страница 1 из 1
14.07.2011, 01:43
    #37350829
AndryG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
Доброго.
При чтении документов по использованию транзакций часто натыкаюсь на фразу "если транзакция напоролась на блокировку, нужно откатить транзакцию и повторить заново".
И учебный примерчик, где транзакцию положили в цикл и крутят её, пока не выполнится.
Гадость ещё та.

Сколько не пробую - не получается у меня стройная модель для обработки отпадающих по блокировке транзакций.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    // кусок кода, покупки шмотки в магазине (игрушечном)
    $q = lib::db()->newQuery( __METHOD__ ,IBASE_WRITE);
    $q->trans()->start();
    try{
      $res = $q->execute(<<<EOL
      execute procedure marketbay(:operation,:party)
EOL
          ,$operation,$party)->result['operation'];
      // а может просто куча запросов, а не хранимка
      $q->trans()->commit();
    }catch(db_Exception $e){
      $q->trans()->rollback();
      throw $e;
    }
Если два покупателя столкнутся лбами, то один из них вывалится с исключением. Что дальше делать?
Всё подсказывает, что стоит попробовать ещё раз. Но такой подход сильно увеличивает размер кода и усложняет его ?
Не обращать особого внимания - "Упс. Попробуйте еще разок" ?

Знаю правильный ответ: "индивидуальный подход". Но он меня не устраивает, ибо я не знаю вариантов решений для индивидуального подхода.

Поделитесь, пжлст, опытом ... как у вас устроена обработка ошибок при выполнении запросов.
...
Рейтинг: 0 / 0
14.07.2011, 09:38
    #37350976
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
AndryG,

индивидуальный подход, это - ВИ или преценденты.
Пишешь их в ворд, а спрограммировать можно всё что угодно :)
...
Рейтинг: 0 / 0
18.07.2011, 09:42
    #37355469
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
AndryGПри чтении документов по использованию транзакций часто натыкаюсь на фразу "если транзакция напоролась на блокировку, нужно откатить транзакцию и повторить заново".
Прикольные учебники.

AndryGВсё подсказывает, что стоит попробовать ещё раз. Но такой подход сильно увеличивает размер кода и усложняет его ?
(задумавшись) А, наверное, Вы собираетесь кодировать это отдельно в вызове каждой из 10'000 хранимок?
...
Рейтинг: 0 / 0
18.07.2011, 20:46
    #37356649
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
"наверное, Вы собираетесь кодировать это отдельно в вызове каждой из 10'000 хранимок? "

Какие хранимки! Вы что :)

Обычно авторы советов "если транзакция напоролась на блокировку, нужно откатить транзакцию и повторить заново" блещут словами "бизнес-объект", "база данных - всего лишь хранилище информации" и прочее многозвенство :)
...
Рейтинг: 0 / 0
18.07.2011, 20:56
    #37356661
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
AndryG, а что смущает?
...
Рейтинг: 0 / 0
20.07.2011, 00:06
    #37358541
AndryG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
softwarer, Shtock, :) вот посему я на форум и пришел.

iscrafm, смущает, что напоровшись на блокировку я стою в полной растеряности, что делать.
Выдавать окно ошибки - глупо - это не ошибка.
Молча спускать на тормозах - задача не выполнена - нельзя.
Выдать сообщение "Вам повезло, вы нарвались блокировку - пробуйте еще раз" - глупо.
Найти нормальные варианты (не демо-учебно-муть) у меня не получилось.
Вот и прошу совета, дабы было над чем думать и что себе придумывать.
...
Рейтинг: 0 / 0
20.07.2011, 00:17
    #37358550
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
AndryGiscrafm, смущает, что напоровшись на блокировку я стою в полной растеряности, что делать.
Выдавать окно ошибки - глупо - это не ошибка.
Молча спускать на тормозах - задача не выполнена - нельзя.
Выдать сообщение "Вам повезло, вы нарвались блокировку - пробуйте еще раз" - глупо.
Найти нормальные варианты (не демо-учебно-муть) у меня не получилось.
Вот и прошу совета, дабы было над чем думать и что себе придумывать.
отведите разумное время на разрешение ситуации (повторение попыток), после чего, все же, отмените транзакцию и попросите, только вежливо конечно, повторить ее позже. Это очень редкая ситуация, но иногда все же случается. Ничего страшного...
...
Рейтинг: 0 / 0
20.07.2011, 09:01
    #37358707
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
AndryG,
программист обязан выяснять глубже причину "нарвались".
Нельзя просто написать
$q->trans()->commit();
}catch(db_Exception $e){
$q->trans()->rollback();
throw $e;
}
и спать спокойно.
- делать модель \ демку \прототип \ нагрузочное тестирование
- разводить блокировки разными методами (форум БД)

В идеале, ошибка - Системная (синий экран виндовс) или "нарвались" ) , должны быть как можно реже.
...
Рейтинг: 0 / 0
26.07.2011, 00:02
    #37366639
AndryG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент. Обработка блокировок при выполнении запросов.
iscrafmотведите разумное время на разрешение ситуации (повторение попыток), после чего, все же, отмените транзакцию и попросите, только вежливо конечно, повторить ее позже.
То есть код примерно такой получается?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<?php
  $i =  3 ; // отводим три попытки на выполнение
  $success = false;
  do{
      // кусок кода, покупки шмотки в магазине (игрушечном)
      $q = lib::db()->newQuery(__METHOD__,IBASE_WRITE);
      $q->trans()->start();
      try{
        $res = $q->execute("execute procedure marketbay(:operation,:party)"
                               ,$operation,$party)->result['operation'];
        // а может просто куча запросов, а не хранимка
        $q->trans()->commit();
        $success = true;
      }catch(db_Exception $e){
        $q->trans()->rollback();
	    if(isDeadLock($e)){ // если ошибка в блокировке записи, то ещё разок попробуем.
          $i--;
        }else{
          throw $e; // а если другая проблема - отдаем выше - пусть там разбираются.    
	    }
      } //catch
    }while($i >  0  && !$success) // перезапускаем транзакцию в надежде выполнить

	if($i ==  0 ){
	  echo "Извините, недоразумение случилось.";
	}else{
	  echo "Операция выполнена успешно";
	}

Слабо верится. что люди так разрулвают конфликты :(
...
Рейтинг: 0 / 0
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Клиент. Обработка блокировок при выполнении запросов. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]