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

ОТДЫХ : Граница Россия - Беларусь

Я не знаю как можно ее описать....
Наверное словами: ее нет. Мы просто проехали оба погранпоста, почти не сбавляя скорости.
На российской скороне кажется не было даже пограничников. Уже не помню это все было 29-го декабря.
Белоруская сторона просто махнула жезлом чтоб не тормозил, скорость была где-то 30-50км/ч.

вторник, 25 декабря 2012 г.

MSSQL : Уровни изоляции в MS SQL - REPEATABLE READ

Сегодня попробую рассказать о блокировке REPEATABLE READ (повторяющееся чтение)

Начнем с определений:

Определение INTUIT
REPEATABLE READ – повторяющееся чтение. Повторное чтение строки возвратит первоначально считанные данные, несмотря на любые обновления, произведенные другими пользователями до завершения транзакции. Тем не менее на этом уровне изоляции возможно возникновение фантомов. Его установка реализуется командой:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Определение WIKIPEDIA
Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)

Определение Microsoft
REPEATABLE READ - Указывает на то, что инструкции не могут считывать данные, которые были изменены, но еще не зафиксированы другими транзакциями, а также на то, что другие транзакции не могут изменять данные, читаемые текущей транзакцией, до ее завершения.
Разделяемые блокировки применяются ко всем данным, считываемым любой инструкцией транзакции, и сохраняются до ее завершения. Это запрещает другим транзакциям изменять строки, считываемые текущей транзакцией. Другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции. При повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведет к считыванию фантома. Учитывая то, что разделяемые блокировки сохраняются до завершения транзакции и не снимаются в конце каждой инструкции, степень совпадений ниже, чем при уровне изоляции по умолчанию READ COMMITTED. Используйте этот аргумент только в случае необходимости.

Ужасные определения! Фантомы, блокировки, транзакции... Намешана каша... Конечно я понимаю что значит эта блокировка, но когда пытаюсь вникнуть в эти определения, то крыша легонько едет. Давайте попробуем вместе разобраться, что к чему. Начнем с основного - cоздадим таблицу и заполним ее.

  1. IF (OBJECT_ID('tmp_isolation_level') IS NOT NULL) DROP TABLE [dbo].[tmp_isolation_level]
  2. GO
  3. CREATE TABLE [dbo].[tmp_isolation_level] ( [rowid] int IDENTITY (1,1), [textvalue] varchar (100))
  4. GO
  5. INSERT INTO [dbo].[tmp_isolation_level] ([textvalue])
  6. SELECT '111111111111'
  7. UNION ALL
  8. SELECT '222222222222'
  9. UNION ALL
  10. SELECT '333333333333'
  11. UNION ALL
  12. SELECT '444444444444'
  13. UNION ALL
  14. SELECT '555555555555'
  15. UNION ALL
  16. SELECT '666666666666'
  17. GO

Теперь приступим в практическому изучению что будет происходить :)
Повторяющееся чтение нам гарантирует неизменность уже прочитанных данных, до завершения транзакции. Т.е. если параллельный запрос попытается их изменить, то это действие будет заблокировано ядром базы, например:
Поток 1Поток 2Комментарий
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
Устанавливаем уровень изоляции.
В данном примере нам не важно какой уровень изоляции будет на 2-м потоке, поэтому я использую значение по умолчанию или "READ COMMITTED"
BEGIN TRANSACTION BEGIN TRANSACTION Открываем транзакции
SELECT * FROM[tmp_isolation_level] - Читаем таблицу в первом потоке (тут все хорошо)
- SELECT * FROM [tmp_isolation_level] Читаем таблицу во втором потоке (тут все хорошо)
- update [tmp_isolation_level]
set [textvalue] = '343434343434'
where [rowid] = 4
Пытаемся внести изменения в данные, во втором потоке.
В этом месте 2-й запрос блокируется 1-м и ожидает завершения транзакиции 1-го потока
COMMIT TRANSACTION - Завершение транзакции 1-го потока разблокирует ресурс (таблицу).
Записываются изменения 1-го потока
- update [tmp_isolation_level]
set [textvalue] = '343434343434'
where [rowid] = 4
Выполняется разблокированный UPDATE
- COMMIT TRANSACTION Завершение транзакции 2-го потока, записываются изменения 2-го потока

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

Поток 1 Поток 2 Комментарий
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
Устанавливаем уровень изоляции
BEGIN TRANSACTION BEGIN TRANSACTION Открываем транзакции
SELECT * FROM [tmp_isolation_level] - Читаем таблицу в первом потоке (тут все хорошо)
- SELECT * FROM [tmp_isolation_level] Читаем таблицу во втором потоке (тут все хорошо)
UPDATE [tmp_isolation_level]
SET [textvalue] = '343434343434'
WHERE [rowid] = 4
- Пытаемся внести изменения в данные, в первом потоке, но данные являются заблокированными
в этом месте 1-й запрос блокируется 2-м и ожидает завершения транзакиции 2-го потока
- UPDATE [tmp_isolation_level]
SET [textvalue] = '343434343434'
WHERE [rowid] = 4
Хорошо, пробуем внести изменения данных во 2-м потоке.
НО, для 2-го потока данные тоже заблокированы....
Сообщение 1205, уровень 13, состояние 45, строка 2
Транзакция (идентификатор процесса 222) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.
- В одном из потоков вылетает ошибка о взаимоблокировке.
Т.е. 1-й и 2-й потоки заблокировали друг друга.
Ядро базы обнаруживает этот факт, прерывает один из потоков, и завершает второй.
Прерваный поток завершается с откатом изменений (ROLLBACK TRANSACTION)
- COMMIT TRANSACTION Прерывание 1-го потока разблокирует 2-й, а он в свою очередь завершается без ошибок.
- Выполнение команд успешно завершено. -

Вот так, вкратце работает REPEATABLE READ.

Успехов вам на поприще программирования SQL.

Источники:
Уровни изоляции в ядре СУБД (MSDN)
SET TRANSACTION ISOLATION LEVEL (Transact-SQL) (MSDN)
Настройка уровня изоляции транзакции (MSDN)
Уровень изолированности транзакций (Википедия)
Уровни изоляции и несогласованность данных (T-SQL.RU)
Уровни изоляции транзакций в SQL. Шпаргалка (Arbinada.com)
Уровни изоляции транзакций в SQL («Мир ПК» , № 07, 2009)

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

МЕНЕДЖМЕНТ : Организационная политика

Сегодня хочу привести выдержку из книги «IT проекты: фронтовые очерки», связанную проблемами возникающими при построении системы.
Поскольку люди не склонны расставаться с властью и влиянием, процесс сборки превращается в политическую игру. Это порождает бессчетные дискуссии о том, кто и какие будет иметь права и обязанности в интересах процесса сборки. Во время таких дискуссий обнажаются все негативные политические тенденции в организации.
Ревнители чистоты воскликнут, что политические устремления достойны только осуждения и им надо всячески препятствовать: работа, мол, достаточно трудна с технической точки зрения и без «загрязнения» ее политикой. Однако в большинстве организаций желание устранить политику не обязательно приводит к ее реальному устранению. Политика – это неотъемлемая часть окружающего нас реального мира, и с ней приходится иметь дело. Вы должны пройти через этот этап, каким бы неприятным он ни казался.
Политика политике рознь
С моей точки зрения, политика политике рознь. С одной стороны, есть «хорошая политика»– нечто сродни понятию «честной борьбы» – и здоровый политический процесс может и должен помогать принимать правильные решения. С другой стороны, существует «плохая политика», в результате которой цели и действия организации могут подчиниться карьерным интересам отдельных личностей, и политику такого сорта необходимо затаптывать на корню. И конечно же, есть еще проблема «серой зоны» – зоны между «хорошим» и «плохим».

пятница, 21 декабря 2012 г.

ОТДЫХ : Получение визы (чать 2)

Сегодня жена съездила и получила наши визы.

По разговорам в очереди я помню, что народ упоминал то что в Литовском посольстве забывают выдать визу на ребенка. У нас все обошлось, все нормально, жалоб нет:).

МЕНЕДЖМЕНТ : Изучайте языки программирования

Странный заголовок, не правда ли?
Казалось бы, это не связанные вещи, но я ITшник по первому образованию и по роду своей деятельности.
Я продолжаю читать книгу Джо Мораско, IT проекты: фронтовые очерки.
Седьмая глава в которой названа : написание кода. Суть этой главы можно свести к нескольким фразам:
Изучайте языки с которыми работают ваши подчиненные, это позволит сократить технологическое отставание Вас как руководителя группы, позволит вести понятный диалог между Вами и программистами.
Для изучения языка используйте стандартные задачи, которые Вам уже приходилось решать, у автора это игра "угадай животное", у меня это поиск и сортировка, у Вас что-то свое.

Знаете мне также приходилось сталкиваться с различными языками программирования, например, Basic, Pascal/Object Pascal/Delphi, C/C++/C#, Perl, PHP и мой любимый SQL.
Я вспоминаю как еще в 1997 году занялся изучением Pascal, для глубокого погружения мною была написана игра "Монополия".
Для реализации мне пришлось изучить работу с графикой, прерывания, для подключения мышки, реализовать простой ИИ, и тогда мне не было еще и 15 лет.
В то время я думал что могу все. На такое глубокое погружение у меня тогда ушло где-то 2 месяца.
Дальше был C и C++, тут было и проще и сложнее, задачей я выбрал реализацию нескольких сортировок и поисков в массиве. Тоже использовал графику для визуализации сравнения скорости поиска, для создания интерактивого взаимодействия с пользователем реализовывал меню, как графическое, так и текстовое.
И так далее и тому подобное....
Сейчас я в основном пишу на SQL по работе, а для себя что-нибудь на Perl/PHP/C++, просто чтобы не терять навык.
Что и Вам советую.

Тестируем Blogger - андроид клиент для блога

Добрался до повторного тестирования Blogger'а на Android.
Судя по всему были исправлены баги при работе с русским языком и это сообщение тому лишнее подтверждение, дополненное фотографией.

Однако, редактировать текст в самом редакторе blogger уже не получится, так как он хранится в кодах utf.

ОТДЫХ : Получение визы

Решили с женой съездить отдохнуть в Литву или, если я правильно сейчас назову, Республика Литва. Ехать хотим на автомобиле. Что нужно для поездки:
1. Загранпаспорт, со сроком действия не менее 3-х месяцев, до даты выезда из страны.
2. Общегражданский паспорт нам не понадобился
3. Для ребенка свидетельство о рождении и его ксерокопия
4. Свидетельство о браке и его ксерокопия
5. Цветная матовая фотография, 35x45.
6. Страховой полис, на запрашиваемый период.
7. Если едете на автомобиле, то гринкард и его копия, аналог нашей ОСАГО, но для заграницы.
8. Расширение каско и его копия, если делали (это вообще не обязательно)
9. Подтверждение об оплате гостиницы и подтверждение о бронировании
10. 35/70€ на человека (консульский сбор для детей до 12 лет не взымается)
11. Заявление о выдаче визы
12. Выписка со счета, чек из банкомата не подходит.
13. Фотографию надо наклеить на заявление
Все выше перечисленное было нами сдано в консульский отдел Литовской Республики. Хочу еще обратить внимание, что если вы хотите ехать в "сезон", например на новый год, подъезжайте к посольству хотябы часам к 7 утра, и то не факт что Вам удастся попасть. Я приехал где-то в 6:30 и если бы не помощь знакомых оказался бы в очереди 30+. Ссылки:
1. Документы для получения визы.
2. Категории лиц, которые освобождены от уплаты консульского сбора.

МЕНЕДЖМЕНТ : 10 мыслей об управления командами

Джо Мараско написал очень интересную и познавательную книгу: IT проекты фронтовые очерки. Сегодня хочу поделиться с вами списком "заповедей" (да, это громко сказано, но все же):
1. Сосредоточте внимание на сколачивание сильной команды, способной решать сложные задачи и создавать реальную дополнительную ценность для клиента.
2. Лидеры вдохновляют, менеджеры обеспечивают. Что бы быть одновременно хорошим лидером и хорошим менеджером, необходимо уметь передавать общую концепцию продукта и разбираться в деталях
3. Готовьтесь к проблемам и устраняйте их в зародыше.
4. Не ленитесь внимательно выслушивать людей, но не принимайте их мнение слишком близко к сердцу.
5. Сосредоточтесь на фактах.
6. Старайтесь укрепить стабильность, играя роль не усилителя, а демпферрирующего звена.
7. Никогда не объясняйте злонамереностью, то что можно объяснить некомпетентностью.
8. Развивайте чувство юмора в противовес напряженномму стремленью: относитесь к работе серьезно, а к себе - с легким сердцем.
9. Не ограничивайте свою жизнь работой и прочитывайте 25 книг в год.
10. Доверяйте своим инстинктам: если к чему-то не лежит душа, то это может быть неспроста.
И добавлю тоже цитату из книги:
Если изложенные здесь 10 мыслей показались вам собранием случайных безделиц, то так оно и есть. Менеджмент и лидерство– все еще виды искусства, а не науки.

MSSQL : Использование EXECUTE

Знаете, чем больше читаю профессиональной литературы, тем больше узнаю что-то новое для себя.
Сегодняшний день, не стал исключением.
Полистал немного книгу SQL Server 2012 Data Integration Recipes автор Адам Аспин и обнаружил что оказывается еще в 2005-м SQL было внесено интересное изменение по синтаксису команды EXECUTE
INSERT INTO dbo.MyOracleTable
EXEC ('SELECT * FROM SCOTT.EMP') AT MyOracleDatabase;
О том что можно линкованный сервер передавать как элемент команды я и не знал.....
Ну что ж 15$ за книгу уже не пропали зря :)