metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-04-28 12:15 pm

Опять же на тему "готовых" решений

В последних постах [livejournal.com profile] yakov_sirotkin про очередь асинхронной обработки задач упоминается, почему они отказались от "готового" решения в виде Oracle AQ: это дело есть только в определенных Edition оракла и при тестировании у них возникли какие-то баги в очередях.

А у меня в двух проектах есть такие задачи, с обработкой очередей. И вот я сразу себе представляю - приезжаем ставить софт, клиент сказал, что у него "есть Оракл", а по приезде оказывается что это Express Edition, а DBA, которые в случае глюков будут разбираться в них, вообще нет. "Сушите весла."

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

[identity profile] alexclear.livejournal.com 2009-04-29 10:28 pm (UTC)(link)
Я дичайшим образом извиняюсь, а где я говорил про read committed?
Уровень изоляции транзакций на СУБД меня не волнует вообще, какой-то есть, да и ладно (собственно, "какой-то" это и есть read committed, не ниже).
Вы знакомы с механизмом работы optimistic locking?
Процесс номер один выхватит эксепшн "optimistic locking failed", или как его там при попыте списать 4 бочки краски, после чего transaction monitor в самом Hibernate откатит транзакцию.
И это, замечу еще раз, безо всяких там блокировок на уровне БД.
Что интересно, это будет работать на MySQL/MyISAM, в котором вообще нельзя транзакцию открыть на уровне СУБД.
(deleted comment)

[identity profile] alexclear.livejournal.com 2009-04-29 11:07 pm (UTC)(link)
Вы сначала попробуйте, будет ли это работать.

Вы всерьез думаете, что я сразу после окончания школы пришел сюда какие-то одному мне известные истины излагать?

Либо хибернатор блокирует объекты на своем уровне, не касаясь БД.

Опять мимо, да.
Скажите, пожалуйста, Вы когда-нибудь так называемую "версионную" БД видели?
Hibernate тупо добавляет ко всем таблицам еще одну int колонку.
Далее объяснять?

Тогда привет целостности от других приложений, например, если рядом шлюз B2B подкачивает документы из филиала.

Как я понимаю, J2EE приложение Вы тоже никогда не видели?
"Целостность от других приложений" - это что, откуда?
Кто же Вас в базу пустит-то в обход application server?
А на уровне application server с целостностью все хорошо, так как DAO layer общий. Я сейчас запамятовал уже, как называется этот стандарт, JPA, наверное, Java Persistence Architecture. Там не только Hibernate стандартизован.

Либо он переводит свои внутренние блокировки на уровень БД, запуская транзакцию с соответсвующим уровнем изоляции.

Мне крайне любопытно как Вы объяснили бы работу этого механизма на MySQL с хранилищем MyISAM.

"The other non-transactional storage engines in MySQL Server (such as MyISAM) follow a different paradigm for data integrity called “atomic operations.” In transactional terms, MyISAM tables effectively always operate in autocommit = 1 mode."

Как-то так.

Независимо от всего сказанного, в обоих случаях транзакция толстая, необходимо минимизировать ее время.

Я, на всякий случай, повторю еще раз, видимо, не последний.
Никакой блокировки нет. Попробуйте это понять.
Время транзакции минимизировать нет никакой нужды.
Кстати, а что такое "толстая транзакция"?
Ни разу не встречал такой термин.
(deleted comment)

[identity profile] alexclear.livejournal.com 2009-04-29 11:26 pm (UTC)(link)
Во-первых, рекомендую почитать про версионные СУБД, чтобы не путать термины.

Я думаю, поскольку Вы продолжаете бой с тенью, термины путает та копия меня, которая у Вас в голове.

Во-вторых, поспрашивайте старших коллег, которым лет за 40, помнят ли они блокировки записей в Clipper/FoxPro/dBase и прочем файлсерверном хозяйстве.
Попросите их рассказать, как они еб.. мучились с этими висящими блокировками, если одно из приложений падало.


Я писал под R:Base и, представьте себе, тоже мучился с блокировками.
В критических случаях приходилось откатываться на бэкапный файл базы, правда, это на более поздних поделках, DOS-версия R:Base все же постабильнее была, чем позднейшие доработки.
И
что?

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

Вы не могли бы мне еще раз показать, кто кого ждет?
Я, реально, столько раз объяснил, что сам уже понял.
Скажите, а Вы на каких языках вообще пишете, кроме SQL?
Можно я еще раз повторю, я уже привык: НИКТО НИКОГО НЕ ЖДЕТ, ВСЕ РАБОТАЮТ В ШТАТНОМ РЕЖИМЕ, НО ТОТ, КТО НЕ УСПЕЛ, ПОЛУЧАЕТ В ЛОБ ОТ ДВИЖКА.
Что я непонятно сказал, а?

В6четвертых, почитайте матчасть по уровням изоляции и попытайтесь понять, чем логическая изоляция отличается от физических блокировок.

Вы сейчас к чему это сказали, а?
(deleted comment)

[identity profile] metaclass.livejournal.com 2009-05-01 07:26 am (UTC)(link)
Вот, кстати, я такую задачу в именно таком виде и не решил. Если заблокироваться на одной записи еще куда ни шло, то заблокироваться по принципу "все записи подпадающие под условие на аналитику" - что-то ничего хорошего из этого не вышло.

[identity profile] metaclass.livejournal.com 2009-04-30 05:39 am (UTC)(link)
Тут, как до меня наконец-то дошло, предлагается вот это:
http://en.wikipedia.org/wiki/Optimistic_concurrency_control

Т.е. даже блокировок не надо и висеть они не будут.

Хотя, кстати, висящие _явные_ блокировки (в виде флага "Занято") не настолько страшное дело - ну будет ходить специальный фоновый процесс, следить чтобы блокировки от отвалившихся юзеров снимались.
Я такое делаю в одном проекте, там обработка документа длительный процесс и выдаются они на обработку по 5 штук пользователю. Если пользователь отвалится - то или подключится через минуту и получит те же документы или же больше не подключится и флаг с документа будет снят через 5 минут и он будет выдан на обработку другому пользователю.

[identity profile] alexshubert.livejournal.com 2009-04-30 05:57 am (UTC)(link)
Во-первых, рекомендую почитать про версионные СУБД, чтобы не путать термины.
об чем вы хотели перетереть за верисонные субд?

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

то значит блокировка имеет место быть.
Вы уверены, что вы девелопер? Чем надо руководствоваться, чтобы пустить транзакцию с wait, мне понять затруднительно.

В6четвертых, почитайте матчасть по уровням изоляции и попытайтесь понять, чем логическая изоляция отличается от физических блокировок.
Простите, но таки чем? Таки где вы видели "физическую" блокировку. Select with lock / prot.edit?

[identity profile] metaclass.livejournal.com 2009-04-30 05:29 am (UTC)(link)
Ой блин, теперь наконец то до меня дошло, что за механизм предлагается.
Использовать колонку версии или таймштампа чтобы при сохранении отследить, что запись меняли до нас и согласовать изменения или свалиться с ошибкой?

[identity profile] alexclear.livejournal.com 2009-04-30 07:35 am (UTC)(link)
Ну да, Hibernate/NHibernate ровно так и делает.
(deleted comment)

[identity profile] metaclass.livejournal.com 2009-05-01 07:29 am (UTC)(link)
Если мы кэшируем остатки на начало рабочих периодов (и текущий) для ускорения расчетов(фактически мемоизация результатов агрегационных запросов) - то можно как раз на этих остатках и хранить версию/таймштамп.
У меня как раз висит подобная задача, нужно будет ради интереса спроектировать ее с таким механизмом.
(deleted comment)

[identity profile] metaclass.livejournal.com 2009-05-01 02:36 pm (UTC)(link)
А, точно, нежелательно ж нарушить инвариант на любой момент учетного периода.

[identity profile] metaclass.livejournal.com 2009-05-01 07:37 am (UTC)(link)
Что-то меня по ссылке таблицы некоторые смущают, а именно колонки типа u1-u13.
Раскладывание аналитики заранее в столбцы конечно упрощает и ускоряет работу, но плохо совместимо с реляционной моделью данных.
(deleted comment)

[identity profile] vp.livejournal.com 2009-05-01 12:03 pm (UTC)(link)
Вот, очень грамотно сформулированная отмазка :) Я тоже так говорю :)