понедельник, 30 января 2012 г.

Блокировки транзакций

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

Одной операции всегда соответствует одна транзакция, но в рамках одной транзакции можно совершить несколько операций.

Зачем это надо? Транзакцию надо открыть, совершить ее операции и закрыть - COMMIT (транзакция фиксируется) или ROLLBACK (транзакция откатывается).. Допустим, вы переводите весь свой капитал с одной карточки на другую. Выглядит это "внутри" системы как несколько операций:

delete from счет1  where счет = счет 1
insert into счет2  values ('сумма')

После удаления денег с одного счета и до того, как они поступят на второй, вполне может оборваться соединение. И деньги канут в лету. Канули. Бы. Но так как транзакция не была закрыта, то и ее изменения не сохранились. Баланс достигнут :)

Но! К каким эффектам может привести параллельная работа двух транзакций?

1 эффект: "Потерянная запись"


Есть некий счет А, на котором лежит 500 у.е.
Кассир 1 (К1 на рисунке) списал с него 300 у.е. Обозначим его действия красными стрелками. Списал 300 - на выходе получает 200.
Кассир 2 (К2) тоже решил обратиться к этому же счету, и записал туда 300 у.е., пока К1 еще не успел закрыть свою транзакцию.
Итог - мы "потеряли запись" первого кассира, ведь на выходе у нас А = 800, хотя должно быть 500. "Кто последний вписал результат - того и тапки". Получается так.

То, что кассир списал 300 у.е., для системы означает начало транзакции (первая стрелка), выполнение действия


update таблицаСчетов  set суммаСчета= '200' where счет = счет 1

И закрытие транзации - вторая красная стрелка.

Второй кассир выполняет операцию: 

update таблицаСчетов  set суммаСчета = '800'where счет = счет 1

Начало и конец которой указаны зелеными стрелками.

2 эффект: "Грязное чтение"


Есть некий счет А, на котором лежит 500 у.е.
Кассир 1 списал с него 300 у.е. Обозначим его действия красными стрелками. Списал 300. Потом передумал и сделал откат - на выходе остались те же 500 у.е.
Кассиру 2 (К2) понадобилась информация по этому счету и он ее считал до того, как К1 закрыл свою транзакцию.
Итог - второй кассир считал неверную сумму, построил неверный отчет/отказал в визе платежеспособному гражданину и тд.


3 эффект: "Повторимое чтение"

 


Есть некие данные.
Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).
Обозначим получение данных зеленым цветом, а изменение - красным.
Кассир 2 влез в эту таблицу данных и изменил некоторые счета в ней.
У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.
Итог - отчет построен на основании разных данных.

4 эффект: "Фантомы"

 


Есть некие данные.
Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).
Обозначим получение данных зеленым цветом, а изменение - красным.
Кассир 2 влез в эту таблицу данных и добавил новые счета/удалил некоторые старые.
У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.
Итог - отчет построен на основании разных данных.

Разница между 3-им и 4-ым эффектами в том, что в одном случае данные изменяются, а во втором - добавляются/удаляются. То есть меняется еще и их количество.

Как бороться с этими проблемами? Чтобы избежать вышеприведенных эффектов, применяются блокировки. Способов реализации изоляции транзакции существует несколько. Основные - блокировочники и версионники. Рассмотрим блокировочники, обеспечивающих различную блокировку транзакций.

Условные обозначения:

"+" - начало блокировки (когда ее ставить)
"-" - конец блокировки (когда ее снимать)



1 эффект: "Потерянная запись"

Решение проблемы потери записи транзакции, которая была открыта первой - ставить эксклюзивную блокировку на запись на все время редактировании. Экслюзивная блокировка на записи может быть только одна, она запрещает все остальные блокировки => Кассир 2 не сможет внести своих изменений, пока Кассир 1 не закроет свою транзакцию.

 Т1 - транзакция первого кассира, начало и конец обозначены красными стрелками.
Такой уровень изоляции носит название READ UNCOMMITED

2 эффект: "Грязное чтение"


Решение проблемы чтения неверных данных вследствие их изменения во время чтения - ставить разделяемую блокировку на чтение.
Разделяемая блокировка - обязательна => Кассир 2 не сможет прочитать данные, пока Кассир 1 не закроет свою транзакцию. Так как на записи уже стоит эксклюзивная блокировка и разделяемую поставить нельзя. Но при этом разделяемых блокировок на записи может быть несколько - чтение другими "лицами" она не запрещает.
 
Такой уровень изоляции носит название READ COMMITED

3 эффект: "Повторимое чтение"


Решение проблемы чтения неверных данных вследствие чтения одних и тех же данных, которые изменили между прочтением - ставить разделяемую блокировку на чтение, но не на время чтения, а до конца транзакции.
Разделяемая блокировка разрешает только наличие других разделяемых блокировок, поставить экслюзивную туда, где уже стоит разделяемая - нельзя => Кассир 2 не сможет изменить данные, пока Кассир 1 не закроет свою транзакцию.
 
Такой уровень изоляции носит название REPEATABLE READ

4 эффект: "Фантомы"


Решение проблемы чтения неверных данных вследствие чтения одних и тех же данных, которых стало больше/меньше между прочтением - ставить предикатную блокировку от начала чтения до конца транзакции.
Предикатная блокировка ставится на условие, а не на конкретную запись/таблицу данных. Если ограничиться разделяемой/экслюзивной, то нельзя будет изменить данные в таблице, но можно будет добавить новые.
Если же поставить блокировку на условие - нельзя => Кассир 2 не сможет изменить данные, пока Кассир 1 не закроет свою транзакцию.

Такой уровень изоляции носит название SERIALIZABLE
 

вторник, 24 января 2012 г.

Программирование для тестировщиков

Быть или не быть? Учиться или не учиться? Это, конечно, риторический вопрос, не хотели бы учиться, так и сидели бы в своем болоте прохождения по тест-плану. Ок, учиться, развиваться. Самому или на курсы пойти? А на какие курсы?

За все курсы не скажу, скажу только за те, что сама посетила. Итак, хотим автоматизировать, пошли на "Программирование для тестировщиков"! Курс сразу зацепил наличием домашних заданий, куда же без них, если хочешь и правда научиться?

Ходила я на пару тренингов для автоматизации... На один день - рассказали про инструмент и "До свидания!". Как вы думаете, много я помню с тех лекций? Ничего! Применить это сразу было нельзя, так как нас отправили на несколько тренингов по разным инструментам, выбирать, типа. В итоге я лично попала всего на парочку, неподготовленная (я замещала заболевших товарищей), вообще ничего не знающая про автоматизацию... Поавтоматизировали календарь, блокнот, гугл. Прикольно? Неа, потому что тренер писал это у себя, оно транслировалось на проектор, и ты или успевал вбивать код почти бездумно или сидел, осмысливал... Под косые взгляды окружающих :))

В общем, с чем пришла, с тем и ушла. Курс однодневный, нам, конечно, дали почту для обратной связи, но... Применять то мы не побежали сразу, а потом уже что писать...

Поэтому и онлайн формат мне приглянулся - выкладываются записи, их можно прослушать, остановить, понять, осознать. Плюс домашнее задание. Это вам не пришли, послушали и ушли. Что увидели, запомнили на 10%, а что сами сделали - на 70%!

Но, учтите, ваш пыл может пропасть :))) Придется снова вспомнить студенчество и тратить на эту ненавистную домашку кучу времени. И азарт может быстро испариться. Или не быстро. Но в любом случае, первые ДЗ - клева, интересно, и тд. А потом может стать и обременительным, особенно, если работы много.

Так что если вам светят авралы - не лезьте. Потому что не делая ДЗ, вы вынесете небольшой урок. Так что лучше переждите бурю и тогда погружайтесь во все новое.

Кстати, читая чужие отзывы, я увидела там фразу "ууу, приходится при просмотре быструю скорость ставить". И все ходила и думала - а зачем? Все ж так удобно! Слушаешь себе запись, следишь за манипуляциями тренера, клац мышкой - остановил, сделал ровно тоже самое. Так прошелся по всей записи, и перечитываешь ДЗ - а что теперь тебе уже самому сделать надо?

А потом поняла - это сейчас просто записи выкладывают, а "первые" ребята слушали Алексея "онлайн", соответственно, остановить его речь они не могли))))) Так что 1.5 часа на сам урок, а потом приходится прогонять его же, но уже ускоренно, второй раз медленно слушать как-то не айс. А прослушивание идет оооочень медленно. 1.5-часовую запись смотреть можно часов 5.

То есть в три раза больше. А уж как обидно, когда просидел почти час, а посмотрел то - 15 минут!!! Ууууу, как медленно :((( А что делать? Пока увидишь, пока повторишь... Готовьтесь, ребятки :)

Но, с другой стороны, это очень удобный формат. Не знаю, как для тренингов по тест-дизайну, а для автоматизации, мне кажется, такой формат даже удобнее, чем - сначала онлайн поглазел, а потом воспроизводи. Остановил где хочешь, а само видео достаточно 1 раз посмотреть :)

Но записи 10, последнего занятия, я очень ждала. Чтобы насладиться просмотром видео без остановок )))) Домашнего задания на него нет, а значит, можно не останавливаться каждую минуту, повторяя за тренером, чтобы позже, допиливая все ДЗ, разобраться подробнее.

Вернемся к курсу. Если пройтись по анкете, которую нам еще не присылали, поэтому взятую отсюда:

Тренер!

Компетентность тренера - разумеется, без сомнений, иначе бы я туда и не пошла :) Мне повезло, я успела послушать Алексея на Конфетке - хорошо объясняет, "надо брать" (с)

Согласна с отзывом "тренер, как обычный человек, все в голове держать не может. Но знает как и где БЫСТРО найти ответ" - вот это тоже мастерство. Если у меня над душой стоят, я могу просто от волнения даже элементарную вещь забыть.

Регламент (насколько хорошо тренер управляет ходом событий и временем) - Тут все хорошо, что было задумано - все было сделано. И сделано много! И всего-лишь за 1.5 часа :)

Риторика, текст (что тренер говорит) и речь (как тренер говорит) - Алексей хороший оратор. Голос не замогильно - умирающий, так что не засыпаешь от него

Экспертиза (как тренер отвечает на вопросы) - тренер ответил не на все вопросы)))))
Да! Как отобразить task-и в Task-ах, я так и не услышала :))) И что за мистика там с Джеймсом (почтовый сервер), что у Алексея все работает без доп настроек, а у части людей с форума - только с ними, ответа пока нет. И я, например, его искать не буду :)) Вот как столкнусь с почтой по работе... Тогда да.

Онлайн-тренинг

Формат онлайн-тренинга (занятие, консультация, поддержка в форуме, домашнее задание) - уже высказывалась выше. Прекрасный формат. Очень удобный. Именно тем, что лекцию всегда можно поставить на паузу и повторить :)

Насколько полно раскрыта тема - вот тут сложнее... В принципе, дано очень много самого разного материала. Это хороший старт для новичка - можно идти и начинать автоматизировать свое приложение. Но. Не знаю, например, хелперы для работы с базой данных нам просто ДАЛИ. Мы их не писали, нам их дали. Хочешь больше - иди изучай SQL, видимо. Аналогично с mail - хелпером. Оно, конечно, пробежались по его методам в самом уроке, но... Когда у тебя есть готовая вещь... Далеко не каждый будет сидеть и вникать :) А если вникать - придется копать глубоко... Что такое вообще соединение, транзакция и тд?

У нас еще и ошибки в хелпере были. Транзакция не закрытая. Пока жалобы не пошли, что "у меня не работает", никто и не знал, что хелпер нам дали немного не верный. Что лишний раз доказывает, что - что дали, то мы и применяем, особо не вникнув, что же там происходит - главное, что хелпер есть и работает!

Насколько интересно подан материал - тут претензий нет. Хотя, согласна, не хватает картинок, диаграмм, который можно было бы открыть "потом". Когда уже успел забыть. Не выискивать в видео, а посмотреть на схему...

Другое

Организационные вопросы - вначале все было хорошо, письма на почту шли и тд.
Потом возникали небольшие косяки, как оценка в 8 из 100, а не из 10. К концу курса стали сбоить письма, это было грустнее - например, проверил тренер 5 дз, а мне одно оповещение всего пришло :((( Тренеру не все оповещения приходили, в итоге народ в скайпе волнуется - почему не проверили? А тренер даже и не знал, что люди выложили это ДЗ...

Оправдались ли Ваши ожидания? - сложно сказать, ведь когда я регистрировалась на курс, мои ожидания были - научиться с нуля. Но до начала курса я уже начала изучать автоматизацию с нуля, и многое мне было знакомо, кроме работы с базой, с фтп... Но эти темы были не сильно раскрыты, только показано "да, так тоже можно", но на них и ДЗ то было "повторить действия в классе", не было простора для фантазии, а, значит, и для косяков ))))

А пока сам шишки не набьешь - мало чему научишься. Скопипастив код из видео, мало что запомнишь... Так что... Курс сам по себе хороший, много полезного дал. В конце концов, 23 ДЗ не прошли бесследно :) Над некоторыми чуть ли не днями приходилось сидеть. И я получила нужные мне навыки. Хотя изначальные ожидания были другие, им было не суждено оправдаться еще до начала обучения :)

Это как сейчас - записалась на курсы по SQL, а половину уже сама узнала. Нууу... Не совсем сама :)))

Общее впечатление - хорошее!

Начало эмоций насчет данного курса я уже писала здесь.
Резюмируя, даже с учетом того, что какие-то основы я уже и так знала... Новое тоже было. И даже не только всякие джеймс хелперы, которые "повтори, как было в классе и успокойся", но, например, конфигурационный файл, чтение тестовых данных из файлы, неплохая разминка по циклам, а уж по дебагу... Это, кстати, главный инструмент разработчика, в том числе и разработчика автотестов :))) Так что весьма полезное умение...

Если вам нужны курсы для того, чтобы начать автоматизацию - идите, не пожалеете. Но учтите, прохалявить не удастся. Придется именно учиться, чтобы какие-то навыки вынести. Готовы? Тогда вперед!

понедельник, 23 января 2012 г.

SQL. Группировка результатов

Что такое join-ы, мы уже знаем. Но просто соединить два множества бывает мало. И нам хочется их сгруппировать, например, для отчета.

Как выполняется группировка? С помощью следующих команд:

group by (измерение 1, измерение 2) - по перечисленным измерениям
group by rollup (измерение 1, измерение 2) - по перечисленным измерениям с итоговыми строками
group by cube (измерение 1, измерение 2) - по всем комбинациям перечисленных измерений с итогами

Непонятно? Давайте на примере.

Связываем наши книги с еще одной таблицей - Publisher, издательство


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


Получили выборку значений. Группировка идет по указанным измерениям, справа налево.
То есть вначале для одного издательства (p.name) мы получили список всех жанров (g.name), потом для второго и тд.

NULL - это строка "Всего". Соответственно, по издательству "Wrox" у нас есть книги с жанром "Стихи" и "Фантастика", и строка - "Всего".

Теперь сравним с выборкой вида cube



Теперь мы получили комбинации со строками "Всего" не только по сворачиваемому измерению, а вообще по всем - по каждому жанру и по каждому издательству, а также "Всего - Всего"

Все равно непонятно, зачем нам эти строки - NULL. Чтобы это понять, рассмотрим группировочные функции:

MIN
MAX
AVG (среднее)
COUNT
SUM
и тд

Выведем сумму по всем жанрам всех издательств


Предварительно, конечно, заполнив цену для каждой книги. Аналогично с остальными функциями.

Если же мы хотим наложить ограничение на уже сгруппированные данные, то пишем функции не после оператора select, а после group by с помощью оператора having


Еще особенность записи операторов:
  • COUNT (ba.bookId) – ненулевые записи
  • COUNT (*) – все записи
Итого:

Последовательность операторов для запросов к БД (используются по мере необходимости):


select            - что выбираем
from              - откуда
where           - условие выборки
group by       - группируем результат
having          - сортируем сгруппированный результат
order by       - сортируем в алфавитном порядке или наоборот

суббота, 21 января 2012 г.

SQA Days 10, после просмотра видео

Чем заняться тестировщику в холодные зимние деньки всем знакомого новогоднего "отпуска"?
Помимо гуляний, разумеется :)

It-conf решил помочь нам в этом сложном вопросе, опубликовав видео всех секционных докладов.

Посмотрела я записи всех докладов, на которые не попала во время посещения конференции (кроме докладов по тестированию мобильных приложений и автоматизации тестирования), появились новые комментарии к ним...

1. Алексей Лянгузов


Первые 9 минут - организационная "вода" :((

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

Слайд "Пример жизненного цикла" я бы разбила с помощью анимации , а то включается слайд и оратора уже не хочется слушать, сидишь, разглядываешь кучу картинок на экране. И в корне неверное утверждение "я знаю, что инфы на слайдах много, я просто поменьше скажу, потом почитаете, посмотрите". Раздаточный материал не должен равняться самой презентации! А сама презентация без докладчика должна быть непонятной, иначе нафига оратор? :) 

*Я прям умная такая вся, еще бы на своем примере клева показала, как надо)))) 

пятница, 20 января 2012 г.

Дистанционное обучение в IT


Где набраться новых знаний в такой распространенной области, как IT?
Особенно, если тратить деньги не очень хочется...

Советую обратить внимание на огромный подарок от "Computer Sience" клубов. Почитать о нем можно здесь.

Что он включает?


Computer Science Center


Это наши новые друзья, совместный проект Школы анализа данных Яндекса, CS клуба, Академии современного программирования и ФМЛ №239. Занятия начались осенью 2011.
Это первые, вступительные курсы.

2011


Основы баз данных, Илья Тетерин
Основы математики, Александр Храбров
Основы C++, Евгений Линский
Основы Java, Георгий Корнеев
Алгоритмы и структуры данных, Александр Куликов
Обзорный курс по анализу данных, Юлия Киселёва
Вычислимость и логика, Дмитрий Ицыксон

Питерский Computer-Science клуб


Это наши старые друзья. Читайте прошлогодний пост об архиве других лет.

осень 2011


Компьютерная графика, В. А. Галинский
Модели веб-графов и их приложения А. М. Райгородский
Введение в комбинаторику слов, А. Э. Фрид
Computer Science семинар (осень 2011)

2010-2011


Линейное программирование, М. А. Бабенко
Квантовые алгоритмы: возможности и ограничения М. Н. Вялый
Параметризованные алгоритмы, Ф. Фомин
Системы типизации лямбда-исчисления, Д. Н. Москвин
Computer Science семинар (весна 2011)
Компьютерное зрение и библиотека OpenCV, В. Л. Ерухимов
Анализ поисковых запросов, П. Браславский
Синхронизируемые автоматы, М. В. Волков
Program Analysis for Security, B. Livshits
Проблема изоморфизма графов, И. Н. Пономаренко
Онтология и представление знаний, Б. Ю. Конев
Семантическая классификация изображений, А. Конушин
Функциональное программирование, Е. Р. Кирпичёв
Теория сложности доказательств, Э. А. Гирш
Computer Science семинар (осень 2010)

И многое-многое другое. Выбирайте интересные для вас знания и изучайте, изучайте, изучайте...

Простые, понятные автотесты. Где почитать о том, как их создать?

Хотите писать простые и понятные автотесты, но не знаете, с чего начать?

Разумеется, об этом уже говорилось! Надо только ссылки знать :)

Если вы хотите пишать на PHP, то вам прямая дорога на Хабр.
О чем там вообще говорится? Есть такой проект, Codeception.

С ним тесты для ваших веб-приложений могут выглядеть так:

<?php
$I = new TestGuy($scenario);
$I->wantTo('create new blog post');
$I->amOnPage('/blog/posts');
$I->click('Create new post');
$I->fillField('Title','Codeception, a new way of testing!');
$I->fillField('Text','Codeception is new PHP full-stack testing framework.');
$I->click('Send');
$I->see('Congratulations, your post is successfully created!');

Таким образом, при минимальном знании английского языка, которому учат в школе, вы можете составлять тесты вида "Я заполняю... Я вижу...". А уже если вас, ко всему прочему, привлекает именно PHP, то эта статья - просто манна небесная! Попробуйте, возможно, автоматизация - это не так страшно :)

Codeception работает на трех китах:
— как тестовая среда используется PHPUnit.
— для приемочных тестов — Mink. За него огромная благодарность Константину Кудряшову everzet.
— и конечно же, Symfony Components. Они используются практически для всего. Особо стоит отметить BrowserKit, который используется для функциональных тестов.

Ну а если вы не знаете английского и хотите работать на С#, и при этом, опять же, хотите автоматизировать и иметь читабельные тесты, заходите на Автоконфетку. Я покажу, как написать тесты, которые смогут понять даже не-программисты