|
|
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте. Клиентское приложение во время работы добавляет запись в одну из таблиц, затем пользователь вносит в диалоговое окно данные для этой записи. После этого пользователь должен или подтвердить ввод данных или отменить (тогда эта запись должна удалиться). Если во время ввода данных программа повиснет/разорвется коннект/и т.д., в таблице останется запись, которая в дальнейшем будет мешать нормальной работе. Как можно выйти из этой ситуации? Ввести сначала данные, а потом уже добавлять запись - только в крайнем случае, если других вариантов не будет :) Спасибо за советы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 12:36 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Если Вы не делаете commit после вставки временной записи - то все само собой рассосется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 12:41 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
если делаете commit(хотя зачем-неясно), то в триггере на logoff надо удалять все временные записи, по которым нет детальных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 12:43 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Такая схема - добавил-удалил - в принципе неверна. Поскольку ненадежна, критична к малейшим ошибкам программиста. Лучше использовать промежуточные буферные либо временные таблицы. При сохранении - запись переносим, при отмене - оставляем как есть. Опционально с какой-то периодичностью можно чистить. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 13:22 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
ShtockЕсли Вы не делаете commit после вставки временной записи - то все само собой рассосется. Не все так просто, вот вставил оператор, новую накладную, нужно получить идентификатор, потом час добавляет перечень, а потом говорит ЭХ! и нажимает кнопку Cancel (в лучшем случае) или Reset. Транзакциями тут никак не обойтись, нельзя открыть транзакцию на час. Мы пошли по другому пути запись сохраняется в основную таблицу но с пометкой что запись "неактуальна", соответственно мы можем работать с записью, но признак того что эта запись актуальна проставится только когда человек нажмет кнопку ОК. Если рухнет коннект, или пользователь нажмет кнопку Cancel то "неактуальная" запись останется в таблице. Конечно ее можно удалить потом скриптом, но из опыта количество таких записей не превышает 5% и на производительность они не влияют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 13:44 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Это делается не в транзакции. Открывать транзакцию на клиенте - не есть хорошо. А на сервере в транзакцию обернута лишь часть ХП, которая и сохраняет данные после того, как пользователь подтвердил их ввод Временная таблица - да, решит проблему. Но у меня возникновение такой "повисшей" записи - маловероятно, хотя и встречается. Делать ради этого временную таблицу ну уж совсем не хочется. Лучше уж какой-нибудь флаг в таблице сделать - валидная ли запись или нет. "Если рухнет коннект, или пользователь нажмет кнопку Cancel то "неактуальная" запись останется в таблице. Конечно ее можно удалить потом скриптом, но из опыта количество таких записей не превышает 5% и на производительность они не влияют." - у меня это влияет не на производительность, а на нормальную работу приложения. Таких записей не должно быть совсем :( Наверное, сделаю не временную таблицу, а флаг. Спасибо всем большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:09 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Давайте пофлеймим,что-ли... А где тогда транзакцию открывать то?Что-то в "Открывать транзакцию на клиенте - не есть хорошо. А на сервере в транзакцию обернута лишь часть ХП, которая и сохраняет данные после того, как пользователь подтвердил их ввод" вызывает у меня непонимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:12 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
KezyaЛучше уж какой-нибудь флаг в таблице сделать - валидная ли запись или нет.<skipped> Наверное, сделаю не временную таблицу, а флаг. Правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:25 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
2 Shtock Тут транзакций вообще не надо открывать нигде - в смысле "специально открывать". Флагом на записи все решается. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 14:42 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
EstetsТранзакциями тут никак не обойтись, нельзя открыть транзакцию на час. Сомнительное утверждение. EstetsМы пошли по другому пути запись сохраняется в основную таблицу но с пометкой что запись "неактуальна", Можно. Но я бы не стал так делать. Со свойственным мне экстремизмом я плохо отношусь к мусору в БД, благо видел и ощущал, сколько удовольствия он доставляет в поддержке и сопровождении. В такой ситуации я бы скорее воспользовался кэшированными изменениями. EstetsКонечно ее можно удалить потом скриптом, но из опыта количество таких записей не превышает 5% и на производительность они не влияют. На производительность - не влияют. Влияют на программистов, которые в ста из десяти тысяч мест забудут написать "and flag_active = 1". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:53 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarer EstetsТранзакциями тут никак не обойтись, нельзя открыть транзакцию на час. Сомнительное утверждение. Угу только вот сам встречался с "программистами" которые пишут на клиенте Код: plaintext 1. 2. 3. 4. 5. 6. 7. а потом удивляются, а почему это вся работа организации клина схватила, а это оказывается тетя Маша получив сообщение об ошибке покурить пошла на часок. softwarerНа производительность - не влияют. Влияют на программистов, которые в ста из десяти тысяч мест забудут написать "and flag_active = 1". И такое бывает. Правда у нас был не флаг, а поле "статус", в котором хранилось текущее состояние документа, и проверять его было все равно обязательно так как возможны были и состояния типа "Удален". Но все рвно забывали. К сожалению я не знаю другого алгоритма внесения MASTER-DETAIL с возможностью откатить вставку и того и другого. Можно конечно попытаться использовать временные таблицы, или структуры в памяти, но тогда возникают проблемы с изменением записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 16:51 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarerв ста из десяти тысяч мест забудут написать "and flag_active = 1". А вью на что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 17:14 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
EstetsУгу только вот сам встречался с "программистами" которые пишут на клиенте ..... а потом удивляются Тем не менее я не вижу никаких оснований лупить глобальными утверждениями там, где речь может идти о частных проблемах конкретного решения. Это будет ровно так же оправданно, как если я скажу "надо делать транзакцию на час, никаких проблем не будет и никакого другого решения никогда понадобиться не может, дурь это все". EstetsИ такое бывает. Правда у нас был не флаг, а поле "статус", Я бы сказал не "бывает", а "будет". При такой структуре избежать этой проблемы практически невозможно; можно только минимизировать вероятность ее возникновения (в частности - не вводить лишних состояний). EstetsК сожалению я не знаю другого алгоритма внесения MASTER-DETAIL с возможностью откатить вставку и того и другого. Хм. Кэширование изменений на клиенте. Для Oracle я не люблю это решение, но для блокировочников оно представляется мне оптимальным вариантом. В моем единственном проекте на MSSQL так и работает. EstetsМожно конечно попытаться использовать временные таблицы, или структуры в памяти, но тогда возникают проблемы с изменением записей. Не очень понимаю, о чем Вы. Для блокировочника единственно потребуется внетранзакционный механизм блокирования документов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 17:35 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
ModelRА вью на что? Не на это :) Согласен, view способны уменьшить количество таких ошибок, но во-первых не до нуля, а во-вторых, цена такого решения будет ненулевой. По сути, программист должен помнить и выполнять правило "нужно использовать вьюхи" вместо правила "нужно проверять статус". При этом элементарно удваивается количество объектов, о которых должен помнить|думать программист; ряд запросов таки должны идти к таблицам итп. Кроме того, в некоторых БД есть претензии к быстродействию view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 17:43 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarerВ такой ситуации я бы скорее воспользовался кэшированными изменениями. Подскажите, пожалуйста, что это такое? Да, флаг (статус) имеет свои минусы, но другого варианта пока нет :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 19:20 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Kezya softwarerВ такой ситуации я бы скорее воспользовался кэшированными изменениями. Подскажите, пожалуйста, что это такое? Хм. Собственно, данные вместе со всеми модификациями хранятся на клиенте (много строк) до той поры, пока не нажимается большая красная кнопка и полный набор изменений одним пакетом отсылается на сервер. Технологическая реализация может быть самой разной, но если подумать, ее можно сделать вполне удобной. Для ввода документов - обычно подходит без проблем, хотя разумеется есть свои ограничения; основное - серверная логика также вынуждена выполняться чохом, в момент сохранения. Когда это может быть неудобным.... например, если Вы хотите сразу в момент создания строки в накладной резервировать товар для этой строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 19:31 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
Не, низависима от тако, делаите вы камит или нет, лучше для надежнасти запись удалить. Для этава нада узнать значения палей, саставляющих их пирвичный ключ, и потом написать оператор SQL DELETE, где в WHERE указать все поля ключа и их значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 01:32 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarerКогда это может быть неудобным.... например, если Вы хотите сразу в момент создания строки в накладной резервировать товар для этой строки. У меня похожая ситуация: добавленная строка влечет за собой дальнейшие действия в базе. Реализовать это все на клиенте конечно можно, но муторно. Естественно, что после удаления строки удаляются и все изменения, с ней связанные. MasterZivНе, низависима от тако, делаите вы камит или нет, лучше для надежнасти запись удалить. Для этава нада узнать значения палей, саставляющих их пирвичный ключ, и потом написать оператор SQL DELETE, где в WHERE указать все поля ключа и их значения. Ну так-то да :) А если в промежуток времени между созданием записи и ее нормальным удалением - клиент "упал". Кто тогда удалит эту "повисшую" запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 05:16 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarer EstetsУгу только вот сам встречался с "программистами" которые пишут на клиенте ..... а потом удивляются Тем не менее я не вижу никаких оснований лупить глобальными утверждениями там, где речь может идти о частных проблемах конкретного решения. Это будет ровно так же оправданно, как если я скажу "надо делать транзакцию на час, никаких проблем не будет и никакого другого решения никогда понадобиться не может, дурь это все". С многими вашими утверждениями согласен, но данное утверждение применительно к блокировочникам буду оспаривать, что называется до последнего "На клиенте никакой визуализации пока открыта транзакция быть не должно", даже пепрерисовки окошек, дабы по возможности сократить время транзакции до необходимого для расчета минимума. softwarer EstetsК сожалению я не знаю другого алгоритма внесения MASTER-DETAIL с возможностью откатить вставку и того и другого. Хм. Кэширование изменений на клиенте. Для Oracle я не люблю это решение, но для блокировочников оно представляется мне оптимальным вариантом. В моем единственном проекте на MSSQL так и работает. Данное решение возможно в частном случае например: есть редактор "партнера", краткое - полное наименование, инн и т.д. и рядом список телефонов. Достаточно просто дать оператору заполнить данные в буфферах, массивах, структурах (в зависимости от используемого ПО) а потом при нажатии кнопки сохранить основную запись MASTER, получить ее идентификатор, и пробежаться по списку телефонов и сохранить DETAIL c заполненным partner_id. Но во первых данное решение требует программирования каждой формы использующей отношение MASTER-DETAIL. Во вторых, всегда найдется более сложные случаи например: Те же партнеры и список адресов (в соответствии с КЛАДР). Тут просто редактирыванием списка (грида) адресов не обойтись, нужно открывать отдельное окно для выбора реквизитов адреса, и передавать изменения между списком и редактором. А потом окажется что к каждому адресу есть еще связанные списки MASTER-DETAIL-DETAIL напимер контактных лиц и телефонов. В результате структура кэша усложняется неимоверно, усдажняется соответственно и написание кода по вставке всего в БД. А как говорится это только начало, при изменении записи нам либо придется поднимать весь кэш на клиента либо опять писать отдельный код по обработке отдельно ИЗМЕНЕНИЯ - УДАЛЕНИЯ записей. И как решить все это безобразие я например не знаю. Мы пошли по пути вставки "неактуальной" записи, если есть другие решения с удовольствием готов их выслушать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 11:26 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
ShtockЕсли Вы не делаете commit после вставки временной записи - то все само собой рассосется. Это все я к тому что открывать транзакцию, вставлять запись и давать пользователю ее редактировать, это самый неудачный вариант решения проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 11:35 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
KezyaУ меня похожая ситуация: добавленная строка влечет за собой дальнейшие действия в базе. Скажу так: по моему опыту перенос отработки логики с момента ввода данных на момент их сохранения не вызывает принципиальных проблем. Но не собираюсь настаивать на нравящемся мне решении; каждый выбирает тот геморрой, который ему более по душе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 11:42 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
EstetsЭто все я к тому что открывать транзакцию, вставлять запись и давать пользователю ее редактировать, это самый неудачный вариант решения проблемы. Это самый удачный вариант решения проблемы. Я почему-то абсолютно уверен, что если загляну в Ваш профиль, обнаружится, что Вы MSSQL-щик (не DB2-шник, не Access-ник, а именно MSSQL). Это к сожалению общая и весьма раздражающая черта специалистов по этому серверу - считать, что других в природе не существует и формулировать местечковую мудрость так, словно это закон природы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 11:47 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
На самом деле пробема описанная здесь решается очень просто. Только нужна еще одна таблица (вспомогательная). Пусть ваш документ разбросан по куче таблиц. Ну и типа существует одна таблица типа- главная где DocID ведется. Ну так вот как только все таблицы заполнены - так во вспомогательную пишете запись с соответствующим DocID - типа документ стал актуальным. Ну и отчеты естественно получаете сджойнив с вспомогательной таблицей. Ну, короче понятно?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 11:48 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
EstetsС многими вашими утверждениями согласен, но данное утверждение применительно к блокировочникам буду оспаривать, что называется до последнего Как раз в этом и состоит моя цель. Надеюсь, на этом примере Вы увидите, что Ваше утверждение применительно к версионникам выглядит столь же... спорно. А следовательно в топике, где ни слова не сказано об используемой БД, нет места ни тому, ни другому. EstetsДанное решение возможно в частном случае Данное решение отлично работает в общих случаях. Разумеется, как и у любой технологии, у него есть свои ограничения, но они непринципиальны. Собственно, мне известны два проекта на десяток человеко-лет каждый, полностью реализованные в такой технологии - полагаю, Вам придется согласиться, что это свидетельство достаточно общего случая. EstetsДостаточно просто дать оператору заполнить данные в буфферах, массивах, структурах :(( EstetsНо во первых данное решение требует программирования каждой формы использующей отношение MASTER-DETAIL. Какая жуть :(( Простите, но говорить так - показывать незнание такого повсеместно презираемого сейчас паттерна проектирования, как "выделение стандартных подпрограмм". Ну или более современных - например, "проектирование базовых классов". Реализация мастер-детали укладывается в считанные строки базового класса "фрейм ввода данных" и позволяет беспроблемно строить сколь угодно сложные иерархии. Например, у меня в такой схеме работал конфигурируемый модуль ввода информации по физюрлицам, банкам итп; полагаю, Вы согласитесь, что информации там достаточно много, и вложенность типа "телефоны сотрудников организации" вполне в порядке вещей. EstetsВ результате структура кэша усложняется неимоверно, усдажняется соответственно и написание кода по вставке всего в БД. Хм. Такое впечатление, что Вы говорите о технологиях программирования позапрошлого века. Хорошо написанная сложная программа состоит из множества простых кирпичиков и достаточно проста в реализации. Согласен, на блокировочнике придется уделить внимание некоторым вещам, которые в версионнике легко решаются. Например, частичный откат - если вы из формы1 вызвали форму2, из формы2 вызвали форму3, в форме3 нажали Ok, а в форме2 - Cancel. Но я не вижу здесь ничего, что я не взялся бы эффективно (то есть хорошо и в разумные сроки) реализовать. EstetsА как говорится это только начало, при изменении записи нам либо придется поднимать весь кэш на клиента либо опять писать отдельный код по обработке отдельно ИЗМЕНЕНИЯ - УДАЛЕНИЯ записей. Зачем? Мне вспоминается эпизод из Гаррисона, где главный герой увидел толпу рабов, крутивших статор вокруг ротора - "если есть два пути что-то сделать, эти выберут худший". EstetsИ как решить все это безобразие я например не знаю. Мы пошли по пути вставки "неактуальной" записи, если есть другие решения с удовольствием готов их выслушать. Собственно сказал. У меня был проект, где заказчик захотел некий не очень с моей точки зрения обоснованный слой доступа к данным - по сути, грузить данные из БД на клиента, там ими оперировать и так вот кэшированно скидывать обратно. Я сейчас посмотрел - модуль, содержащий базовые классы для работы этого слоя, занимает порядка двух тысяч строк. Если добавить в него всю функциональность, которую я себе в принципе представляю для такой задачи - получится... думаю, тысяч пять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 12:16 |
|
||
|
Временная запись, добавляется с клиента. Как потом её корректно удалить?
|
|||
|---|---|---|---|
|
#18+
softwarer EstetsЭто все я к тому что открывать транзакцию, вставлять запись и давать пользователю ее редактировать, это самый неудачный вариант решения проблемы. Это самый удачный вариант решения проблемы. Это хороший способ, но в блокировочниках так нельзя. П.э. для блокировочников это "самый неудачный вариант решения проблемы". Не только для MSSQL. softwarerХм. Кэширование изменений на клиенте. Для Oracle я не люблю это решение, но для блокировочников оно представляется мне оптимальным вариантом. В моем единственном проекте на MSSQL так и работает Ну вы сделали версионник своими руками. Наверное вам так привычнее, хотя мне кажется, что это более трудозатратное решение, чем введение статусов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 12:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33601643&tid=1545361]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 507ms |

| 0 / 0 |
