Анимация
JavaScript
|
Главная Библионтека • END TRANSACTION - блокирует записи, записывает на диск все изменения, сделанные после ближайшей команды BEGIN TRANSACTION, затем снимает блокировку с записей. Изменения в таблицах, в индексных файлах CDX и в полях примечаний таблиц, которые принадлежат базам данных, могут использовать команды транзакций. Транзакции могут работать только с полями таблиц или представлений, но не с переменными памяти и другими объектами. Изменения выполняются в конце транзакции. Транзакция кэширует изменения на диске или в памяти. Когда транзакция заканчивается, изменения записываются на диск. Если изменения не могут быть записаны на диск, вся транзакция целиком откатывается и ни одно изменение не завершается. Транзакции обеспечивают встроенную систему, которая защищает базу данных от разрушения с помощью отмены всех изменений, в случае если по каким-то причинам изменения не могут быть записаны на диск. Транзакции откатываются путем возвращения всех измененных записей и индексов в первоначальное состояние. Для большей надежности защиты данных транзакции следует использовать вместе с буферизацией для предотвращения потери данных. Транзакции могут иметь пять уровней вложенности. Если вы попытаетесь добавить шестой уровень, то будет сгенерирована ошибка. Когда вы изменяете записи в базе данных, которая является частью транзакции, другие пользователи в сети не могут иметь доступа (чтения и запись) к этим записям, пока не завершится транзакция. Если другие пользователи в сети пытаются получить доступ к записям, которые вы модифицируете, им придется ждать завершения транзакции. Они будут получать сообщение "Record not available<193>Please Wait" ("Запись не доступна. Подождите, пожалуйста"), пока записи не станут доступны. Поэтому необходимо делать транзакции как можно меньше по длине или проводить транзакции в то время, когда другие пользователи не нуждаются в доступе к данным. Команда END TRANSACTION сохраняет все изменения, сделанные в таблицах, индексных файлах CDX и полях примечаний, и заканчивает транзакцию. Все изменения, сделанные в базе данных между предыдущей командой BEGIN TRANSACTION и END TRANSACTION, завершаются. Если транзакция является транзакцией первого уровня или единственной транзакцией (то есть транзакцией без вложенности), то изменения записываются на диск. Если транзакция вложенная, то END TRANSACTION переводит все кэшированные изменения на следующий уровень. Вложенные транзакции обладают потенциальной возможностью переписать изменения, сделанные в транзакции на более высоком уровне. В случае если в это время завершается еще одна транзакция, команда END TRANSACTION сгенерирует ошибку. Имеет смысл вставить в цикл команду END TRANSACTION, которая будет работать до тех пор, пока транзакция не сможет завершиться. Для того чтобы сделать откат транзакции, которая началась с помощью команды BEGIN TRANSACTION, используйте команду ROLLBACK. Эта команда восстановит первоначальное состояние таблиц, индексов и полей примечаний. Когда вам необходимо выяснить, на каком уровне вложенности вы находитесь в процессе транзакции, используйте функцию TXNLEVEL(). Ниже приведен простейший пример ее использования: OPEN DATA auto store USE Model BEGIN TRANSACTION ??TXNLEVEL **** Будет выведено значение 1, которое равняется ***** текущему уровню транзакции BEGIN TRANSACTION ?? TXNLEVEL **** Будет выведено значение 2, которое равняется ***** текущему уровню транзакции END TRANSACTION END TRANSACTION Теперь рассмотрим основные правила работы с транзакциями. • Транзакции должны объявляться с помощью команды BEGIN TRANSACTION. Если будут выполняться команды END TRANSACTION или ROLLBACK без соответствующей команды BEGIN TRANSACTION, то будет сгенерирована ошибка. • Транзакции действуют, пока не будут выполнены команды END TRANSACTION или ROLLBACK. Транзакции могут проходить через несколько процедур или функций. Если приложение заканчивается без команды END TRANSACTION, то выполняется команда ROLLBACK. • Транзакции используют данные, кэшированные в буфере транзакции, а не данные на диске, для того чтобы использовать самые новые данные. • Транзакции не могут переписать существующий индексный файл с помощью команды INDEX. • Транзакции могут использоваться только с таблицами, принадлежащими базам данных. Если вы включили ручную блокировку таблицы или файла во время транзакции с помощью функций FLOCK() и RLOCK(), то необходимо обязательно снять блокировку. Команда END TRANSACTION не снимет блокировку. Во вложенных транзакциях команды ROLLBACK и END TRANSACTION работают с изменениями, которые произошли после последней команды BEGIN TRANSACTION. Изменения внутри вложенных транзакций не запишутся на диск, пока не завершится самый верхний уровень, то есть не будет выполнена самая последняя команда END TRANSACTION. Если транзакции выполняются над одними и теми же данными, то преимущество имеет то изменение, которое было выполнено последним, независимо от того, на каком уровне оно находится. Например: USE Account BEGIN TRANSACTION BEGIN TRANSACTION REPLACE count WITH 103 FOR count=203 END TRANSACTION REPLACE count WITH 203 FOR count 103 END TRANSACTION В таблице значение поля так и останется равным 203. Перепишем данный пример так, что последняя команда REPLACE будет выполняться перед следующим уровнем вложенности: USE Account BEGIN TRANSACTION REPLACE count WITH 203 FOR count 103 BEGIN TRANSACTION REPLACE count WITH 103 FOR count=203 END TRANSACTION END TRANSACTION Теперь значение поля останется тем же, что и было - 103. Несколько советов по увеличению производительности при работе в сети в приложениях Microsoft Visual FoxPro Если локальная станция имеет достаточно места на жестком диске или достаточно RAM, то вы можете улучшить производительность, разместив временные файлы на локальном диске или на RAM диске. Перенаправление этих файлов на локальный диск или диск RAM увеличивает производительность за счет уменьшения обращения к сетевому диску. Вы можете указать альтернативное местонахождение для этих файлов, включив выражения EDITWORK, SORTWORK, PROGWORK и TMPFILES в ваш файл CONFIG.FPW. Если есть возможность отсортировать данные, то имеет смысл это сделать, так как работа с таблицами происходит быстрее, если у вас не включены индексы. То есть используйте поиск с помощью команды, а затем отключайте порядок индекса. Если есть возможность работать с какими-то файлами монопольно, то используйте эту возможность, так как при монопольном режиме доступ к таблицам осуществляется быстрее. Чтобы уменьшить вероятность попытки одновременного доступа к записи или таблице, сокращайте время блокировок, что можно осуществить, блокируя записи только при сохранении данных на диск, а не во время их редактирования. Оптимистическая буферизация обеспечивает вам кратчайшее время блокировки. Microsoft Access Средства настройки оболочки Access позволяют установить режимы по умолчанию для открытия баз данных и таблиц. Для этого используется команда Параметры в меню Сервис. После Параметры Режим таблицы Вид Клавиатура р Блокировка по умолчанию- йтсуггстЕует1 С Всех записей С Изменяемой записи Таблицы/запросы Общие Модуль Формы/отчеты Правка/поиск р Режим открытия по умолчанню-(* Общий доступ с Монопольный доступ р Операции DDE- П Пропуск команд DDE Р Обновление связей DDE Время ожидания OLE/DDE (с): Число повторов обновления: Период обновления ODBC (с): Период обновления (с): Период повторов обновления(мс): 250 1500 Отмена 11рименить Рис. 7.20. При выборе кнопки "Отсутствует" вы сможете установить только нежесткую блокировку записи. С помощью такой блокировки все редактируемые записи доступны для других пользователей, но при этом, когда вы отредактируете запись и попытаетесь сохранить изменения, то столкнетесь с одним из двух вариантов. Первый, самый простой: кроме вас запись никто не редактировал и сделанные изменения заносятся на диск. Второй: после того как вы начали редактировать данные, кто-то успел изменить их раньше вас и записать изменения на диск. В последнем случае появится окно сообщения, в котором будет предложено три варианта выхода из сложившейся ситуации: игнорировать чужие изменения и записать на диск свои, скопировать измененную запись в буфер обмена, сохранить чужие изменения и отменить свои. Этот режим иногда называется "оптимистической" блокировкой. Если вы выберете блокировку изменяемой записи, то для других пользователей будет заблокирована запись, которую вы редактируете, и соседние с ней записи, так как Access устанавливает блокировку для страницы. Страницой для таблиц Access является набор записей размером в 2 килобайта. Эту блокировку иногда называют "пессимистической". При выборе блокировки всех записей остальные пользователи не смогут открыть таблицу. При этом следует обратить внимание на тот факт, что если вы работаете с данными с помощью формы, то можете установить для нее блокировки с помощью свойства RecordLocks, которые могут отличаться от установок по умолчанию для текущего сеанса работы Access. Эти типы блокировок строго соответствуют тем видам, которые вы устанавливаете с помощью диалогового окна Параметры. Свойство RecordLocks помимо форм присутствует еще у запросов и отчетов. При этом для отчетов нет возможности установить блокировку изменяемой записи, скорее всего потому, что отчет их изменять не может. В диалоговом окне Параметры можно установить режим по умолчанию для открытия баз данных. Но учтите, что режим доступа к базам данных можно выбирать при их открытии с помощью диалога открытия. Если базы данных открываются монопольно, то остальные пользователи не смогут открыть их, поэтому данный режим вряд ли подходит для сетевого использования. того как появится диалоговое окно, показанное на рис. 7.20, необходимо перейти на вкладку Другие. После этого, используя набор кнопок "Блокировка по умолчанию", вы можете выбрать необходимый тип блокировки. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 [ 83 ] 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |