Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
У меня следующий вопрос: имеется исходный код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 06:19 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
В Вашем случае не надо. На то она и транзакция, чтобы откатить все операции, которые в нее включены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 09:46 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
SergeyPlВ Вашем случае не надо. На то она и транзакция, чтобы откатить все операции, которые в нее включены. Это понятно, но если replace отработал, а insert нет, я ведь не проверяю результат вставки. Вопрос в том, нужно ли его проверять! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 09:56 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
В таком контексте нужна проверка корректного завершения каждой команды модификации. -) INSERT-SQL может НЕ выполнить вставку (много причин), как следствие, REPLACE будет выполнен не туда -) Собственно REPLACE может НЕ выполнить модификацию (тоже много причин) Т.е. вопрос даже не в блокировках (хотя тоже есть опасность "мертвых" блокировок, но для этого есть SET REPROCESS), а в корректности выполнения команд. Обычно для модификации используют буферизацию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Это, кончено, всего-лишь общая схема. Но суть именно в этом: модификация - в собственно буфере, а потом разовый сброс буфера. Разрешение конфликтов совместного доступа сведено к одному программному узлу (TableUpdate()). А при выполнении собственно команд модификации надо следить только за ошибками корректной модификации данных и уже не обращаешь внимания на проблемы совместного доступа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 12:56 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
Тогда наверное имеет смысл включить буферизацию и для третьей таблицы (в которой выполняется replace). В этом случае даже не надо проверять старое значение и новое, чтобы определить выполнился ли replace. Потому что все моменты связанные со сбросом буфера в таблицу берет на себя FoxPro (читай функция TableUpdate()). Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 13:10 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
И вообще, насколько эффективно с точки зрения безопасности и надежности использование транзакции в FoxPro? Не проще ли старым дедовским методом: блокирую все таблицы, вставляю, снимаю блокировку... Понятно, что делать я так не буду, но всё-таки хочется услышать Ваше мнение. Все дело еще в том, что блокировать "надолго" записи у меня возможности (есть свои причины), именно вследствии этой причины я и пришел к использованию транзакции, хотя не очень уверен в обоснованности ее использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 13:15 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
LevranТогда наверное имеет смысл включить буферизацию и для третьей таблицы (в которой выполняется replace). Ну, да, буферизировать надо все таблицы, которые собственно модифицируются. Хотя, возможны исключения из этого правила в конкретной задаче. LevranВ этом случае даже не надо проверять старое значение и новое, чтобы определить выполнился ли replace. Потому что все моменты связанные со сбросом буфера в таблицу берет на себя FoxPro (читай функция TableUpdate()). Так? Не совсем. При буферизации нет никакого контроля на значение данных. Проверяется сам факт модификации данных. Но ведь вполне возможно, что пользователь изменил какое-то поле, а потом спохватился и вернул старое значение. При этом, хотя поле было модифицировано, но его значение по сути не изменилось. Если для Вас это имеет принципиальное значение, то такую ситуацию следует дополнительно контролировать. LevranИ вообще, насколько эффективно с точки зрения безопасности и надежности использование транзакции в FoxPro? Насколько эффективно и безопасно работать с таблицами DBF? Вопрос того же уровня. LevranНе проще ли старым дедовским методом: блокирую все таблицы, вставляю, снимаю блокировку... Понятно, что делать я так не буду, но всё-таки хочется услышать Ваше мнение. Суть транзакции - это внесение изменений по принципу "Все или ничего". Т.е. либо ВСЕ изменения будут внесены в базу данных, либо не будет внесено НИКАКИХ изменений. Если жы Вы будете работать без транзакции через блокировку таблиц, то пондобиться самостоятельно писать код по откату внесенных изменений, если, например, в первую таблицу внесли изменения, а во вторую не удалось. Или не изменились часть записей в одной таблице. LevranВсе дело еще в том, что блокировать "надолго" записи у меня возможности (есть свои причины), именно вследствии этой причины я и пришел к использованию транзакции, хотя не очень уверен в обоснованности ее использования. Не совсем понял: Вы можете или нет блокировать запись "надолго"? Впрочем, стратегия программирования, как правило, предполагает, по возможности, сводить к минимуму время блокировки записей. Приведенный пример кода как раз для этого и предназначен. В режиме оптимистической буферизации таблиц (5), один пользователь может сколь угодно долго производить модификацию своего буфера при этом никак не мешая другому пользователю модифицировать те же самые данные. Блокировка данных будет производится только в момент сброса изменений (по TableUpdate()). В это же время производится и разрешение конфликтов совместного доступа. Если действительно была модификация одних и тех же данных (второй параметр в команде TableUpdate()+AERROR()- код ошибки 1585) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 14:36 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ К сожалению при прямой работе с таблицами даже буферизация не будет панацеей - ибо часть операций проверки будет сделана ДО сброса буфера. Именно к вставке это и относится в первую очередь. Среди проводимых проверок - проверка уникальности индексов. Введение ещё одного уровня косвенности - локальных представлений - решает большинство проблем IMHO. Posted via ActualForum NNTP Server 1.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2004, 23:40 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Обычно для модификации используют буферизацию: Далее вы пишите, что нужно включить оптимистическую блокировку таблиц. Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 07:32 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
Буферизация и транзакция - это 2 разных процесса. Выбор типа буферизации никак не может повлиять на логику работы транзакции. Особенность транзакции заключается в том, что если внутри нее сделана любая блокировка данных, то эта блокировка не может быть снята пока не будет так или иначе завершена транзакция. Отличие оптимистической буферизации от пессимистической заключается в моменте установки блокировки на редактируемые данные. При оптимистической буферизации в процессе редактирования буфера данные остаются НЕ заблокированными. Блокировка осуществляется только в момент сброса буфера (например, по команде TableUpdate()). Как следствие, одни и те же данные в режиме оптмистической буферизации одновременно могут редактировать несколько пользователей. "Разбор полетов", т.е. чьи же изменения следует записать в базу данных осуществляется в момент попытки сброса буфера. При пессимистической буферизации данные блокируются в момент начала их модификации. Блокировка снимается в момент сброса буфера. Как следствие, если один пользователь начал редактирование данных, то другой уже не сможет начать редактирование пока первый пользователь их не закончит. Однако попытка второго пользователя начать модификацию вызовет сообщение об ошибке (108 или 109), которую необходимо будет перехватить и обработать. По возможности, не желательно использовать пессимистическую буферизацию. И вообще, желательно свести время блокировки данных к возможному минимуму. Если опустить чисто психологическую проблему (пользователь желает редактировать, а его не пускают), то проблема в том, что блокировка данных - это технически опасный момент. В том смысле, что сбой питания или обрыв соединения в этот момент может привести к порче структуры таблицы (но может и НЕ привести. Как повезет). Более опасным в этом смысле является только прямое редактирование данных неопределенно долгое время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 09:27 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
2 ВЛАДИМИРМ ==Как следствие, одни и те же данные в режиме оптмистической буферизации ==одновременно могут редактировать несколько пользователей. "Разбор ==полетов", т.е. чьи же изменения следует записать в базу данных ==осуществляется в момент попытки сброса буфера. А НЕ ПОДСКАЖЕТЕ ЛИ ПО-КОНКРЕТНЕЙ НАСЧЕТ РАЗБОРКИ ПОЛЕТОВ... ИМХО - если НЕ разбирать их - то в базу запишутся данные того, кто последний нажал СОХРАНИТЬ... Но ведь это порой не хорошо... как быть тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 09:31 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
&&&&& А НЕ ПОДСКАЖЕТЕ ЛИ ПО-КОНКРЕТНЕЙ НАСЧЕТ РАЗБОРКИ ПОЛЕТОВ... ИМХО - если НЕ разбирать их - то в базу запишутся данные того, кто последний нажал СОХРАНИТЬ... Но ведь это порой не хорошо... как быть тогда? Посмотрите парой постов выше: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это, опять же, только схема. Если сброс буфера окружен транзакцией, то перед запросом к пользователю надо отменить транзакцию (ROOLBACK) и заново начать весь процесс, если пользователь захотел писать поверх изменений другим пользователем. Ни в коем случае нельзя оставлять "подвешенную" тарнзакцию на момент ожидания реакции пользователя! Впрочем, прежде чем писать такую обработку, неплохо бы оценить, насколько в конкретной задаче запись поверх изменений другого пользователя будет критична. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 09:44 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
Может подскажите, где хранится буфер транзакции. Локально? В dbc? И где найти документальное подтверждение этому... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 10:01 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
авторМожет подскажите, где хранится буфер транзакции. Локально? В dbc? И где найти документальное подтверждение этому... В dbc. Там есть запись ObjectName="TransactionLog", в одном из memo-полей этой записи ИМХО и хранится журнал транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 10:51 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
2 XAndy Я сомневаюсь что там что-то хранится, и тем более что фокс реально ведёт полноценный "лог транзакции". Я думаю что тут всё попроще будет. Как доводы: Открытие dbc в режиме NOUPDATE не мешает транзакции, Просмотр этого поля dbc в другой сессии во время специально подвешенной транзакции ничего не показывает, равно как и просмотр в той-же сессии (USE database.dbc SHARED AGAIN IN 0 ALIAS tmpDB), введение в VFP9 транзакций для free-таблиц. Как я понимаю вся информация вплоть до ROLLBACK/END TRANSACTION хранится исключительно в памяти фокса, и при сбоях просто пропадает. Вообще транзакции фокса существенно отличаются от транзакций других СУБД. Это факт. Posted via ActualForum NNTP Server 1.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2004, 02:16 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
Вообще-то Ken Levy заявил, что в VFP пока не планируется вводить полноценную базу данных в качестве источника данных. Но если кому надо - то есть MS SQL Server (2Gb бесплатно - остальное за деньги ) Так что естественно транзакции в VFP не совсем надежны. Хотя все познается в сравнении - выдерните провод питания из сервера SQL при большой загрузке - и Вы поймете, что нет в жизни совершенства Но это уже в другой раздел этого уважаемого форума - могу подсказать ключевые слова для поиска - "База упала/слетела/исчез transaction log e.t.c."... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2004, 12:27 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
В умной книжке Рода Пэддока "VFP 6. Разработка корпоративных приложений" написано Пэддок ...VFP использует протокол транзакций, но не создаёт для этого отдельной таблицы... Может кто подскажет, можно ли сохранить этот протокол, или хотя бы посмотреть его в момент выполнения.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2004, 13:35 |
|
||
|
Использование транзакций
|
|||
|---|---|---|---|
|
#18+
2 Levran Штатных средств точно нету, про недокументированные я ничего не знаю. В общем маловероятно что ты найдёшь где-то решение. Скорее всего для этого надо залазить в память фокса, ковыряться в его внутренних структурах, и т.п. Posted via ActualForum NNTP Server 1.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2004, 23:58 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32715881&tid=1595697]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 261ms |
| total: | 412ms |

| 0 / 0 |
