![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
свойства tIbTransaction [D7, fb2]
Евгений Р. © (2008-08-21 15:09:00)Можно ли по активной транзакции определить, используется ли она только для чтения или ею внесены изменения в БД (требуется commit)?
MsGuns (2008-08-23 14:46:00) [1]>Игорь Шевченко © (22.08.08 18:39) [31]
>Просто не стоит свои приемы работы выдавать за непререкаемые истины >для всех случаев
Вот и я о том же ;)
Игорь Шевченко (2008-08-22 18:39:00) [2]MsGuns © (22.08.08 17:06) [30]
Да нет, мы не странные. Просто не стоит свои приемы работы выдавать за непререкаемые истины для всех случаев.
MsGuns (2008-08-22 17:06:00) [3]>Игорь Шевченко © (22.08.08 16:57) [29]
>А кому нужен в базе документ с 50-ю строками из 100 ?
А кому нужен документ, который за раз сможет ввести только Анка-пулеметчица, и то за сутки непрерывной работы ?
Экие вы странные оба однако. Такое ощущение, что с живыми людьми только на улице общаетесь ;)
Игорь Шевченко (2008-08-22 16:57:00) [4]MsGuns © (22.08.08 16:46) [27]
А кому нужен в базе документ с 50-ю строками из 100 ?
Sergey13 (2008-08-22 16:56:00) [5]> [27] MsGuns © (22.08.08 16:46)
А кто как сделал струтуру БД и приложение - так и делать. Ты же вот делаешь у себя поле "проведено". Это решение для твоего частного случая. Кому то оно не подойдет - ему надо сразу все или ничего. А кому то вообще пофиг - хоть неделю заводи и БД все равно согласованная. Транзакции позволяют работать с любой бизнеслогикой.
MsGuns (2008-08-22 16:46:00) [6]>Sergey13 © (22.08.08 09:16) [22]
>НЕ любая, а только переводящая документ из одного согласованного состояния в другое согласованное.
Интересно девки пляшут. Это если в документе 100 строк, то записывать его в базу нужно только тогда, когда все 100 строк будут введены, а если не успел к закрытию конторы, то с утряка по новой, эге ж ?
Sergey13 (2008-08-22 12:16:00) [7]> [25] Евгений Р. (22.08.08 11:26)
Если мне память не изменяет в ФБ реализовано выражение FOR UPDATE в запросе SELECT. Но злоупотреблять им не стоит и использовать следует с осторожностью.
Евгений Р. (2008-08-22 11:26:00) [8]И еще:
наверное параллельно Вы блокируете открытие (или редактирование) документа, открытого одним из пользователей?
Если да, то каким образом:
1.у самого документа есть признак "открыт"
2.есть отдельная таблица с идентификаторами открытых документов
3.отслеживать блокировки документа (не представляю как)
Евгений Р. (2008-08-22 11:18:00) [9]состояние, как я понял - проведен/не проведен?
Игорь Шевченко (2008-08-22 11:02:00) [10]
> "Коммитить" надо любой пост, что автоматически и делается,
> если асякой фигни не панавыставлять ручками шаловливыми.
> А вот сам документ должен иметь статус "проведено", который
> выставлять по команде пользователя когда он введет весь
> документ. А до того остатки по карточкам не менять.
SQL-сервер - эт вам не парадокс. Это вы в файловой базе могете такие приемы использовать. А для большинства SQL-серверов придуманы транзакции, чтобы нужда в изобретении велосипедов отпала
Sergey13 (2008-08-22 09:16:00) [11]> [21] MsGuns © (22.08.08 09:05)
> [14] прочитай, а ?
Именно поэтому и написал свои возражения.
> [14] MsGuns © (21.08.08 22:51)
> Пункт 7.
> Не противоречит сказанному в [10] ибо любая модификация
> - добавление - удаление записи в режиме ручной работы с
> документом должна фиксироваться в БД, иначе возникнет эффект
> "Я вводила - куда она подевалась ?"
НЕ любая, а только переводящая документ из одного согласованного состояния в другое согласованное.
MsGuns (2008-08-22 09:05:00) [12]>Sergey13 © (22.08.08 08:56) [20]
[14] прочитай, а ?
"Коммитить" относится к посту или транзакции ? Не надо "вводить в заблуждение неопытных пользователей" ;)
Sergey13 (2008-08-22 08:56:00) [13]> [10] MsGuns © (21.08.08 20:31)
Не надо выдавать свои наработанные приемы работы за всеобщее обязательное правило и вводить неопытных пользователей в заблуждение.
Коммитить надо НЕ "любой пост", а транзакцию. Транзакция - это модификация БД переводящая эту самую БД из одного СОГЛАСОВАННОГО СОСТОЯНИЯ в другое. Эта модификация может быть как изменением одной записи так переписыванием половины базы.
kaif (2008-08-21 23:04:00) [14]Я обычно делаю проще.
В DataSource на событие DataChange при условии параметра Field <> nil делаю SaveAction.Enabled := True; То же делаю и на событие AfterDelete детальных датасетов.
На Form1.OnCloseQuery документа делаю проверку SaveAction.Enabled и если True прошу юзера все сохранить (проведение и CommitRetaining) или нет (RollBack) или отмена Form1.CanClose := False.
Еще есть кнопка Save со значком дискеты, которую он всегда нажать может. Там и проведение и CommitRetaining.
А транзакцию я сую в каждую форму. По умолчанию она RollBack.
Благо InterBase не боится множества транзакций. И еще у меня есть одна общая транзакция ReadOnly (read nowait) в глобальном модуле данных. Это для чтения всяких справочников и прочей фигни, не требующей изменений данных.
Loginov Dmitry (2008-08-21 23:01:00) [15]> В некоторых случаях без него трудно обойтись
В каких например?
MsGuns (2008-08-21 22:55:00) [16]Не согласен только с п.20 о вето на Float. В некоторых случаях без него трудно обойтись, а работать с ним вполне можно, соблюдая некоторые простые правила.
Loginov Dmitry (2008-08-21 22:52:00) [17]хотя нет, там уже не поймешь, кто у кого :)
Loginov Dmitry (2008-08-21 22:51:00) [18]> Это излишне нагружает сервер." п.7 http://www.cyberguru.ru/database/inte
> rbase/interbase-hints.html
>
> уж не знаю кому верить.
вообще-то оригинальный текст статьи находится здесь:
http://ibase.ru/devinfo/dontdoit.htm
MsGuns (2008-08-21 22:51:00) [19]Пункт 7.
Не противоречит сказанному в [10] ибо любая модификация - добавление - удаление записи в режиме ручной работы с документомдолжна фиксироваться в БД, иначе возникнет эффект "Я вводила - куда она подевалась ?"
В ручном режиме человек физически не сможет загружать сервер обновлениями чаще нескольких раз в минуту и только по одной записи зп раз - для сервера это вообще ничто.
Пункт 8.
Не противоречит ибо за один раз вы изменяете, добавляете, удаляете только однузапись. В этом пункте говорится о том, что если идет "массовое" удаление/добавление/изменение, например в цикле, то следует по возможности весь "пакет" заворачивать в одну транзакцию. При подтверждении каждого изменения в режиме "пулемета" сервер явно может "перегреться"
Вам нужно что-нибудь почитать о принципах организции работы именно с документами, которые, как правило, хранятся в нескольких связанных таблицах. В частностях, о проведениях и откатах документов - как это делается и зачем.
Евгений Р. (2008-08-21 22:47:00) [20]я понял, что редактировангие через dbGrid - не популярно здесь.
но если есть такая необходимость, то commit рекомендуете делать автоматом по AfterPost, AfterDelete?