четверг, 13 сентября 2012 г.

Транзакции

Этот эксперимент не касается напрямую "АС-Библиотека-3". Однако, поскольку она не может работать без поддержки СУБД он вполне уместен. К тому же производительность системы в целом существенно зависит от данного звена.

Итак, после перехода на MS SQL, решил повозиться с транзакциями, точнее различием их поведения в MS Access и MS SQL. Набросал маленький hta скриптик (в конце статьи ссылки и рекомендации для тех, кто решит повозиться сам). Смысл его в параллельном запуске двух различных SQL запросов, с различным уровнем изоляции транзакций. То есть мы, просто искусственно сталкиваем транзакции и смотрим результат. База состоит из одной таблицы Table_1, в которой два поля - fld1 и fld2. Данные появляются и изменяются в процессе работы. Вначале подключаемся к Access базе Test1.mdb и запускаем два экземпляра скрипта. По умолчанию выбрано adXactCursorStability (adXactReadCommitted) и это единственный уровень изоляции, поддерживаемый базой Access, остальные либо игнорируются, либо приводят к ошибке. В "левом" скрипте выбираем команду обновления
 update Table_1 set fld2 = :Param1 where fld1 = :Param2
и изменяем строку с fld1 = 3, присваиваем fld2 значение 7. Жмём Старт и видим окошко с предложением зафиксировать транзакцию. Пока не нажато ОК, транзакция находится в активном состоянии. В это время в "правом" скрипте запустим операцию чтения той же строки с fld1 = 3. Чтение происходит успешно.

Жмём ОК в "правом" скрипте, а затем в "левом", и смотрим результат. Всё в соответствии с описанием уровня изоляции adXactReadCommitted. "Правый" скрипт без препятствий вычитал старое значение fld2 = 3, поскольку новое fld2 = 7 ещё не было зафиксировано.


Теперь изменим параметры подключения на SQL Server, и повторим предыдущие шаги. Видим, что SQL Server встрял по полной! Как видно на скриншоте



"правый" скрипт даже PrintScreen не берёт. Более того - он встрянет даже при чтении соседней строки. Как это отражается на производительности "АС-Библиотека-3" понятно - пока кто-то проводит интенсивные изменения в базе, остальные ждут, вне зависимости от количества ядер в твоём сервере. Но главная проблема - полное несоответствие описанию поведения уровня изоляции adXactReadCommitted. Глюк? "Курим" мануалы ...
Находим интересную команду (надо сказать, что такому поведению SQL Сервера в документации посвящена целая глава и, по хорошему – сначала читаем, потом делаем, но …  ):
 alter database Test1 set read_committed_snapshot on
переводящую базу в режим контроля версий строк (off - отключить; применять в контексте базы master; работает почти мгновенно, если долго ковыряется, значит что-то блокирует базу). Применяем её и всё становится на свои места. То есть поведение блокировок ничем не отличается от Access. Посмотреть текущий режим работы баз можно запросом:
 select name, is_read_committed_snapshot_on  from sys.databases
К сожалению, протестировать этот режим в "боевых" условия при интенсивной нагрузке в настоящий момент не имею возможности - нет "полигона". Проверка в однопользовательском режиме на Демо-версии проблем не показывает, но этого мало. Если заинтересуешься и сделаешь это - сообщи в комментарии. Потребуется поддержка, готов помочь.
В конце несколько слов о содержимом архива.
Скачать архив здесь - TransactTest.zip
1. Transact.hta - запускаемый скрипт. Для редактирования строк подключения открыть в "Блокноте".
2. Test1.mdb - база Access. Для подключения в Transact.hta снять комментарий (//) и закомментировать стоку SQL Server, при необходимости откорректировать путь к базе.
3. Test1.mdf, Test1_log.ldf - база данных и журнал транзакций SQL Server. Скопируй их в стандартный каталог баз (где лежит master.mdf) или придётся возиться с настройками доступа. В Transact.hta сними комментарий со строки подключения, замени XXXX на реальный пароль sa  и закомментируй строку подключения Access. Если подключиться не удаётся – смотри в мануалах конструирование строки подключения (эта задача не тривиальна), но если ты воткнул Z-Сервер, то воткнёшь и скрипт.

На этом всё. Если есть вопросы – пиши комментарий.

Добавил видео по теме. Для просмотра лучше скачать.

4 комментария:

  1. Написал комментарий- он пропал куда-то. полчаса писал. Еще раз проверю.
    В. Фролов
    tikhiydon@gmail.com

    ОтветитьУдалить
  2. Здравствуйте! Случайно нашел по Google родственную душу и записался в Ваш блог, или как это? Дело в том, что я попал на работу в Ростовский ГЭУ (РИНХ) в автоматизированную библиотеку. Перед этим здесь несколько человек уволилось, а один, что остался, болеет. У нас система Библиотека 3 на MS SQL Server. Я раньше работал на Oracle и ms SQL тоже немного знаю. Передо мной поставлена задача следующая- внедрить модуль Книгообеспеченность.
    Я установил, что нужно создать справочники дисциплин, специальностей. преподавателей и т.д. Подозреваю, что справочники здесь хранятся в BLOB- полях.
    У меня вопросы, если можно.
    1. Можно ли импортировать справочники?
    2. Можно ли в записи о книги создать поля, выбираемые из этих справочников (900 поля, что- ли?), чтобы потом их заполнить?
    3. Что такое базы данных здесь? Вот вы пишете- demo? У меня БД Databases, Databooks, Explain,
    Library_, LIBRARY2, libraryVocab,SYSTEM library, VOCAB. Где же здесь Demo?

    Если можете, подскажите, или дайте наводку, очень прошу! Не знаю, где читать, куда обратиться.

    Владимир Фролов
    tikhiydon@gmail.com

    ОтветитьУдалить
  3. Здравствуйте! Случайно нашел по Google родственную душу и записался в Ваш блог, или как это? Дело в том, что я попал на работу в Ростовский ГЭУ (РИНХ) в автоматизированную библиотеку. Перед этим здесь несколько человек уволилось, а один, что остался, болеет. У нас система Библиотека 3 на MS SQL Server. Я раньше работал на Oracle и ms SQL тоже немного знаю. Передо мной поставлена задача следующая- внедрить модуль Книгообеспеченность.
    Я установил, что нужно создать справочники дисциплин, специальностей. преподавателей и т.д. Подозреваю, что справочники здесь хранятся в BLOB- полях.
    У меня вопросы, если можно.
    1. Можно ли импортировать справочники?
    2. Можно ли в записи о книги создать поля, выбираемые из этих справочников (900 поля, что- ли?), чтобы потом их заполнить?
    3. Что такое базы данных здесь? Вот вы пишете- demo? У меня БД Databases, Databooks, Explain,
    Library_, LIBRARY2, libraryVocab,SYSTEM library, VOCAB. Где же здесь Demo?

    Если можете, подскажите, или дайте наводку, очень прошу! Не знаю, где читать, куда обратиться.

    Владимир Фролов
    tikhiydon@gmail.com

    ОтветитьУдалить
    Ответы
    1. Да, с документацией проблема. Поэтому и приходится экспериментировать. Для начала можно посмотреть здесь http://www.ians.ru/support/instr - это официальный сайт разработчиков.
      На вопросы постараюсь ответить позже, на почту.

      Удалить